2016-02-08 29 views
0

我試圖去通過一個鏈表中C.C連接列表:在Windows分段故障,在Mac

列表項被定義爲

struct list_element { 
    struct list_element *next; 
    int value; 
}; 

列表頭定義作爲

struct list_head { 
    struct list_element *front; 
    struct list_element *end; 
}; 

,我試圖打印這樣

void printList(struct list_head* head) { 
    if(head == NULL|| head->front == NULL) { 
     printf("List is empty \n"); 
     return 0; 
    } 

    struct list_element* elm = head-> front; 
    int numberOfElements = 0; 

    while(elm != NULL) { 
     printf("%i", elm -> value); 
     printf(" "); 
     elm = elm -> next; 
    } 
    printf("\n"); 
} 
項目0

這適用於我的Mac在XCode和https://ideone.com,但在Windows和http://codepad.org它導致「分段錯誤」。看起來好像

while(elm != NULL) { 
    printf("%i", elm -> value); 
    printf(" "); 
    elm = elm -> next; 
} 

導致一些問題。它看起來像榆樹沒有指向最後一項NULL,即使它應該。

我加入的項目,如本

struct list_element* list_push(struct list_head* head) { 

    //List head is null 
    if(!head) { 
     return NULL; 
    } 

    //Initialize list element 

    struct list_element* elm = malloc(sizeof(struct list_element)); 

    if(elm == NULL) { 
     //Couldn't alloc memory 
     return NULL; 
    } 

    if(head->front) { 
     head->front = elm; 
     head->end = elm; 
    } else { 
     //List head is not null, set next elm to point to current elm 
     elm -> next = head -> front; 
     head->front = elm; 

    } 

    return elm; 
} 

我很認真地困惑,爲什麼相同的代碼會在一些地方而不是在別人打工。 (它的工作原理上IDEone和XCode的,它不會對鍵盤和Code :: Blocks的Windows上使用相同的代碼工作)與NULL爲第一要素

Example on IDEone Example on Codepad

+0

在XCode中調試不會顯示任何錯誤,也不會顯示valgrind。但運行編譯的二進制結果在分段錯誤 – Simon

+1

通常,如果您的程序在一臺計算機上發生段錯誤,似乎在另一臺計算機上「工作」,那麼它會顯示「未定義的行爲」。谷歌「未定義的行爲C」瞭解更多。 –

回答

3

您必須初始化ele->next列表,否則您訪問elm = elm->next中未初始化的內存列表的最後一個元素。除此之外,您必須將if(head->front)更改爲if (head->front == NULL)。適應你的代碼是這樣的:

struct list_element* list_push(struct list_head* head) { 

    if (head == NULL) 
     return NULL; 

    struct list_element* elm = malloc(sizeof(struct list_element)); 
    if (elm == NULL) 
     return NULL; 

    if (head->front == NULL) // <-------------- 
    { 
     elm->next = NULL;  // <--------------- 
     head->front = elm; 
     head->end = elm; 
    } 
    else 
    {  
     elm->next = head->front; 
     head->front = elm; 
    } 
    return elm; 
} 

確保您初始化head->fronthead->endNULL

+0

謝謝,似乎問題是我忘了用NULL初始化head-> front和head-> end。 – Simon

2

問題是malloc沒有爲您分配給它的內存調零。您可以手動將next指針設置爲NULL,也可以使用calloc分配內存,該內存將爲您歸零。它在某些環境而不是其他環境中工作的原因是,它會觸及在某些情況下已經用零寫入的內存,或者出於安全原因,某些操作系統會爲您清除內存。

+0

非常感謝您的信息。我不知道這個事實。 – Simon

+0

'calloc'將清除該區域的所有位,它不一定與_null pointer_(或'0.0,btw。)相同。更好的是明確地設置指針。 – Olaf