簡體   English   中英

如何在 C 中制作隊列的副本?

[英]How can I make a copy of a queue in C?

我試圖將一個隊列復制到另一個隊列中,以便如果我銷毀一個隊列,它不會銷毀另一個。

我嘗試以這種方式使用memcpy

memcpy(queue1, queue2, sizeof(queue2));

但我收到以下錯誤:

預期為“void * restrict”,但參數的類型為“Queue”

是否可以將一個隊列復制到另一個隊列中?

編輯

這是隊列的結構:

typedef char *Following;

typedef struct _NodeQ {
    Following element;
    struct _NodeQ * next;
} NodeQ;


typedef struct {
    int error;
    NodeQ * first;
    NodeQ * last;
} Queue; 

memcpy絕對不是這樣,因為那只會讓你執行“淺拷貝”。 如果您認為您的對象可以存儲指向外部數據的指針,那么該對象的淺拷貝將指向完全相同的外部數據,而不是復制所有內容(“深拷貝”)。

淺與深復制 img (圖片來源)

執行深拷貝的方法完全取決於實現。 看起來您的隊列正在使用一個簡單的鏈表實現(查看每個NodeQ結構如何包含一個指向另一個NodeQ結構的指針,該指針具有另一個指向另一個結構的指針,等等)。 這在 C 中很常見。困難的部分是弄清楚如何復制隊列中每個對象的“數據”部分(在這種情況下是Following類型變量)。 我不知道您正在使用哪種庫或框架來定義Queue類型,您應該參考一些文檔來幫助您了解具體細節。 誰知道呢,也許你會找到一種受圖書館支持的方式來復制你想要的方式。 盡管如此,我會嘗試做你想做的事,並有一些假設。

從這一點開始的猜測

這只是一個猜測,但似乎Following可以表示一個字符串,因為它是一個字符指針。 我在下面編寫的代碼使用了這個假設。 請注意,雖然它未經測試並且有點匆忙,但我只是想說明在您的場景中執行手動深層復制的方式。

Queue queue2;
NodeQ *e2, *e2prev = NULL, *e2first = NULL;

// Iterate through all elements of the first queue
for (NodeQ *e1 = queue1.first; e1; e1 = e1->next) {

    // Allocate memory for the new element of queue 2
    if (!(e2 = (NodeQ*)malloc(sizeof(NodeQ)))) {
        printf("not enough memory\n");
    }

    // Remember the first element of queue for future use
    if (!e2first)
        e2first = e2;

    // Note that strlen here could cause a segfault if my guess that "element" is a string is wrong
    size_t buflen = strlen(e1->element) + 1; // +1 for null terminator
    if (!(e2->element = (Following)malloc(sizeof(char) * buflen))) {
        printf("not enough memory\n");
    }
    strcpy(e2->element, e1->element);

    e2->next = NULL;

    // Link new element with previous element
    if (e2prev)
        e2prev->next = e2;

    e2prev = e2;
}

queue2.error = queue1.error;
queue2.first = e2first;
queue2.last  = e2;

您的編譯器警告您memcpy兩個指針作為第一個參數。 這將是正確的復制方式:

memcpy(&queue1, &queue2, sizeof(queue2));

上面的行將用queue1的內容覆蓋結構queue2 ,有效地將quque2復制到queue1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM