2013-05-05 176 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; 
}