[英]strcpy segmentation fault
我有一個四邊形列表,並且它們的標簽從1開始。backpatch采用了指向某些四邊形的列表結構。 我想backpatch更新那些四邊形,將z放在char *上,然后清空l,這樣我以后可以放其他四邊形。盡管我已經為char * z
和char * 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.