簡體   English   中英

strcpy分割錯誤

[英]strcpy segmentation fault

我有一個四邊形列表,並且它們的標簽從1開始。backpatch采用了指向某些四邊形的列表結構。 我想backpatch更新那些四邊形,將z放在char *上,然后清空l,這樣我以后可以放其他四邊形。盡管我已經為char * zchar * fourth four分配了內存,但在backpatch的strcpy seg.fault了seg.fault。 有人知道為什么會這樣嗎?

struct quad {
char *label; //5
char *first; //30
char *second;
char *third;
char *fourth;
struct quad *next;
};

struct list {
    struct quad *quadlist;
    struct list *nextlist;
};


void backpatch(struct list *l, char * z) {
struct list *temp = (struct list*) malloc(sizeof (struct list));
temp->nextlist = (struct list*) malloc(sizeof (struct list));
temp->quadlist = (struct quad*) malloc(sizeof (struct quad));
temp->quadlist->fourth = (char*)malloc(30 * sizeof (char));
l->nextlist = (struct list*) malloc(sizeof (struct list));
temp = l;
//z=(char*)malloc(sizeof(struct list))
while (temp->nextlist != NULL) {

    strcpy(temp->quadlist->fourth, z);
    temp = l->nextlist;
}
strcpy(temp->quadlist->fourth, z);

free(temp);
free(l);

}

即使我只保留

while (l->nextlist != NULL) {

strcpy(l->quadlist->fourth, z);
l = l->nextlist;
}
strcpy(l->quadlist->fourth, z);
free(l);

部分,它也存在段錯誤...

從評論:

//z=(char*)malloc(sizeof(struct list))

看起來您為z分配了內存,但它已成為一個非NULL終止的字符串。 因此,strcpy會繼續復制,並最終開始讀取z的末尾。 檢查z befor strcpy中的內容

您創建temp並為其及其組件分配內存,但是當temp = l;時,您將其丟棄temp = l; 因此,所有這些調用都會泄漏內存,因為您從不使用分配或釋放的內存。 函數末尾的兩次free調用是錯誤的,temp不再指向您分配的內存,並且您不釋放temp結構內分配的其他內存。 釋放l會破壞您嘗試更新的列表的開頭-我很確定那不是您想要的。

當你做temp = l; 您松開了對剛分配的所有內存的引用,現在l和temp指向相同的“結構列表”

你有struct quad *next; 在四邊形結構中,但是當您的列表結構將四邊形鏈接到列表中時,這是做什么用的?

你的while循環對我來說似乎是錯誤的temp->nextlist是您在l->nextlist = (struct list*) malloc(sizeof (struct list));調用malloc的結果l->nextlist = (struct list*) malloc(sizeof (struct list)); 但是您永遠不會初始化結構,因此l-> nextlist-> nextlist將是垃圾,可能指向任何地方。

我建議您不要再看backpatch,而是編寫一個顯示數據的函數,這樣做會產生兩種效果,您將知道結構是正確的,並且將更好地了解結構如何鏈接在一起。 您需要了解結構和指針如何組合以創建這樣的鏈接列表。 Google for C鏈表實現,並閱讀一些實現鏈表的現有代碼。

您的代碼實際上想做什么?

暫無
暫無

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

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