2013-05-05 181 views
0

我剛剛開始使用C,我認爲整個指針/ malloc/free讓我很生氣。我試圖定義一個簡單的線性遞歸數據結構,並通過它循環,打印出我所穿過的每個元素。 (代碼如下)。循環遍歷遞歸列表C

但是,我得到段錯誤:一旦11,我嘗試移動到下一個元素,以「插入」一個新的元素

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct number_list { 
    int num; 
    struct number_list *next_num; 
} numlist; 

int main() { 
    numlist *cur, *pointer; 
    numlist *NewList=NULL; 

    cur = NewList; 

    cur = malloc(sizeof(numlist)); 
    cur->num=5; // this operation is never reached too 
    cur = cur->next_num // Must I malloc? 
    printf("Reached."); // Is never reached. 
    cur->num=9; 

    pointer=NewList; 

    while (pointer!=NULL) { 
     printf("%d", pointer->num); 
     pointer=pointer->next_num; 
    } 
    return 0; 
} 

而且,我有另一個更大的程序while-循環,其功能完全像這樣的while循環,除了在「填充」遞歸結構之外。因此,我實際上並不需要創建任何新元素,只需通過並打印每個元素即可。但是,在循環打印最後一個元素的那一刻,它又崩潰了Segmentation Fault:11。我猜這可能是因爲我試圖做pointer = pointer->next_num。那麼我如何正確地在C上正確運行這樣的數據結構呢?

回答

1

您有一些概念性問題。首先你需要知道指針和它指向的內存之間的區別;

int a1 = 0; 
int a2 = 0; 
int *b = &a1; 
*b = 3; 
// now a1 = 3, a2 = 0 
b = &a2; 
*b = 2; 
// now a1 = 3, a2 = 2 

這意味着,在以下兩行:

cur = NewList; 
cur = malloc(sizeof(numlist)); 

第二完全取代所述第一分配。

現在這行:

cur = cur->next_num; 

next_num還尚未設置,所以CUR設置爲垃圾內存(所以它甚至不是NULL malloc不爲零的內存)。你應該做的是;

cur->next_num = malloc(sizeof(numlist)); 
cur = cur->next_num; 
cur->next_num = NULL; // explicitly NULL-cap, because of issue mentioned above. 

最後,NewList在最後仍然是NULL。你應該在第一個malloc行之後使用NewList = cur;。在真實的代碼中,你可以將大部分這些內容放入可重用的函數中,但是爲了學習這些修補就足夠了。

此外,在您提到的最後一個元素打印後崩潰可能是由於NULLing問題。就我所見,你的while環路本身就很好。

+0

是的謝謝你的解釋,絕對清除了很多東西了! – mercurial 2013-05-06 12:45:20

0

您沒有爲NewList分配內存。

cur = NewList; 
cur = malloc(sizeof(numlist)); 

它必須是:

NewList= malloc(sizeof(numlist)); 
cur = NewList; 

是的,你必須每個元素分配內存。

+0

好的,我爲NewList和'cur = malloc(sizeof(numlist));''在'cur-> num = 5'和'cur-> num = 9'之前分配了內存,所以它現在看起來像這樣 'cur = malloc(sizeof(numlist)); cur-> num = 5; curl = malloc(sizeof(numlist)); cur = cur-> next_num; cur-> num = 9; ' 不幸的是仍然會產生分割錯誤:11.我試圖通過在代碼的不同部分放置'printf'來測試它,它似乎甚至不能運行'main()'的第一行。它雖然編譯完美。 – mercurial 2013-05-05 12:57:57

0
#include <stdio.h> 
#include <stdlib.h> 

typedef struct number_list { 
    int num; 
    struct number_list *next_num; 
} numlist; 

numlist *NewList(int value){ 
    numlist *newp; 

    newp = malloc(sizeof(numlist)); 
    if(newp){ 
     newp->num = value; 
     newp->next_num = NULL;//initialize! 
    } 
    return newp; 
} 

int main() { 
    numlist *cur, *pointer; 
    numlist *newList=NULL; 

    cur = NewList(5); 
    newList = NewList(9); 

    newList->next_num = cur; 
    cur = newList; 

    pointer=cur; 

    while (pointer!=NULL) { 
     printf("%d ", pointer->num); 
     pointer=pointer->next_num; 
    } 
    return 0; 
}