2012-09-14 48 views
0

我不斷地用一小部分代碼得到一個分割錯誤,我不知道爲什麼,我使用malloc,並且不能看到任何原因,只要它碰到數據,它的崩潰。 的數據是:構造函數的malloc問題

listNode* node = (listNode*)malloc(sizeof(listNode)); <-This is the Line 
strcpy(node->entry, string); 
node->next = NULL; 

使用結構定義:

typedef struct 
{ 
    char* entry; 
    struct listNode* next; 
}listNode; 

的數據在一個點上沒有得到釋放,但它不能達到上述點。 感謝您的幫助!

+0

您爲結構本身分配了內存。但是你沒有爲它的指針。 – Mysticial

回答

1

您沒有爲entry指針分配內存。您試圖將您的string複製到由未初始化指針entry指定的虛假位置。您可能會這樣做:

node->entry = malloc(strlen(string) + 1); 
strcpy(node->entry, string); 
+0

或'node-> entry = strdup(string);' – John3136

+0

oops,甚至沒有注意到嘿,我要用它來拋出數據分段錯誤我應該用哈哈,謝謝! –

+0

@ John3136如果可用。它不是從1999年開始的C標準。 –

2

你確定你在調用malloc時崩潰嗎?這很可能是你在碰撞strcpy。實際上,strcpy在這種情況下幾乎是保證會導致不良行爲,但確切地說,行爲是未定義的。

只要你沒有填滿你的堆,malloc應該成功。但是,因爲您撥打malloc而不是calloc,您不能保證node->entry的內容。 C標準沒有定義在內存中分配了malloc的內容,因此node->entry填充了垃圾。通過嘗試複製到錯誤的指針,您的應用程序崩潰嘗試訪問不正確的內存地址。

阿列克謝·伏龍芝是在修復100%正確 - malloc空間和改變node->entry在新分配的內存點,然後複製stringnode->entry。這避免了使用未初始化指針的未定義行爲,正如我在another SO answer中所述。

0

您沒有爲入口指針分配分配內存。因爲雖然分配結構只是4個字節分配給*入口指針 您應該做

listNode * node =(listNode *)malloc(sizeof(listNode)); //爲內存分配結構 node-> entry = malloc(strlen(string)+ 1); //爲字符串分配內存 strcpy(node-> entry,string); //複製字符串

現在它會正常運行