2014-04-29 83 views
0

我有一個四邊形列表,他們有一個從1開始的標籤。該backpatch正在採取列表結構,指向一些四邊形。我想派遣更新這些四邊形,將字符*放在第四個,然後清空,所以我可以把其他四邊形later.I獲得seg.fault在backpatch的strcpy,雖然我已經爲char * zchar * fourth分配內存。有誰知道爲什麼會發生這種情況?strcpy分段錯誤

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); 

部分,其也seg.fault ...

+0

你是否仔細檢查了'z'指向的字符串是否不大於你分配的30個字節。你也不應該把'malloc'返回,這是一個常見的錯誤來源。 –

+0

['valgrind'](http://valgrind.org)可能會有所幫助。 – zwol

+0

確保'l'已正確初始化。因爲你在賦值'temp = l;' –

回答

0

從註釋:

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

它看起來像你分配內存爲z但它成爲一個非NULL終止的字符串。所以strcpy一直在複製,並最終開始讀取z的結尾。檢查什麼是z befor strcpy

0

您爲它及其組件創建temp併爲其分配內存,但當您執行操作時將其丟棄temp = l;因此,所有這些調用都會泄漏內存,因爲您從不使用分配或釋放它的內容。在函數結尾的兩個對free的調用是錯誤的,temp不再指向你分配的內存,並且你不釋放temp結構內部分配的其他內存。釋放l破壞了你想要更新的列表頭 - 我很確定這不是你想要的。

當你做temp = l;你失去了你的refence到所有的內存,你只是分配,現在L和溫度都指向同一個「結構列表」

您在四結構,但作爲你的表結構的鏈接有struct quad *next;四邊形成一個列表這是什麼?

while循環看起來我錯了 - temp->nextlist是你的結果調用l->nextlist = (struct list*) malloc(sizeof (struct list));對malloc但你永遠不初始化結構使1-> nextlist-> nextlist將是垃圾,並可能指向任何地方。

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

你的代碼實際上試圖做什麼?

+0

我假設有四邊形(四個字符串),而* l是四邊形列表。 struct list是一個結構,它有一個指向四元組的指針和一個指向列表其餘部分的指針。 backpatch()必須輸入* l列表中的所有四元組,並將* z放入第四個字符串中。 –

+0

我會從頂部開始:我有一個四邊形列表。這就是爲什麼我需要*旁邊的四邊形結構。並且他們有一個從1開始的標籤。現在,補貼正在採用指向某些四邊形的列表結構。我希望backpatch更新這些四邊形,將z放在char *第四個上,然後清空l,以便稍後可以放入其他四邊形。 –