2011-06-30 21 views
0

这是我在StackOverFlow上的第一篇文章。 我正在研究链接列表 - 下面是我的代码。 我只是添加一个节点来列出并打印它 - 我所做的只是传递一个指向“addTermNode”函数的指针,然后将此传递的指针指向新创建的节点。C中的单连接列表

#include<stdio.h> 
#include<time.h> 


typedef struct _termination_code_ { 
    int terminationCode; 
    unsigned long time; 
    struct _termination_code_ *next; 
}termination_code; 

int addTermCode(termination_code *infoTerm, int termCode, unsigned long timerInfo) 
{ 
     termination_code *node; 
     node=(termination_code*)malloc(sizeof(termination_code)); 
     if(NULL == node) return -1; 
     node->terminationCode=termCode; 
     node->time=timerInfo; 
     node->next=NULL; 
     infoTerm = node; 
     return 0; 
} 

int main() 
{ 
     termination_code *list2=NULL; 
     //Add A single node and print it. 
     if(addTermCode(list2, 12, time(0))==0) 
       printf("All OK node added\n"); 
     else 
       printf("something went wrong\n"); 

     printf("Entered info :%d %ld\n",list2->terminationCode,list2->time); 
} 

这里我得到的输出 - 不知道为什么。请帮忙。

[[email protected] rnd]$ ./a.out 
All OK node added 
Segmentation fault 
[[email protected] rnd]$ 

感谢

回答

0

问题是你传递新对象的方式。将新对象分配给指针将不会按您写入的方式工作。您应该从addTermCode()函数返回对象。

基本上你的list2指针仍然是空的。从该函数返回新创建的对象并将其分配给list2。

如果没有,您需要调整您的代码,以便正确指定指针。

int addTermCode(termination_code **infoTerm, int termCode, unsigned long timerInfo) 
{ 
    .... 
    *infoTerm = node; 
} 

int main() 
{ 
    termination_code *list2=NULL; 
    //Add A single node and print it. 
    if(addTermCode(&list2, 12, time(0))==0) 
     printf("All OK node added\n"); 
    printf("Entered info :%d %ld\n",list2->terminationCode,list2->time); 
} 
+0

谢谢ricosrealm - 我刚才弄清楚同样的事情.. :) – Ahmed

2

在addTermCode要更改infoTerm变量的值。该值是一个指针,但你只是改变本地值(C只是传值)。要改变函数外部的指针,你应该传递一个指向指针的指针...类似于termination_code ** infoTerm,并更改* infoTerm = &节点。

而且,很明显,分段错误是因为您正在访问外部指针,该指针尚未更改,仍然指向错误的地址。