在写一段小程序的时候,遇到了问题。
问题1:为什么在Init 函数中L->next 等于NULL,而在main函数中不等?NULL 在C中是怎么定义的?
问题2:为什么释放L的时候会出错呢?是和L定义的位置有关吗?
代码如下:
#include<stdio.h> #include<stdlib.h>
struct node{ int data; struct node *next; };
void Init(struct node *L){ struct node *tempNode; tempNode = (struct node *) malloc(sizeof(struct node)); tempNode->next = NULL; /*next 为 NULL */ L = tempNode; if(L->next == NULL) /判断下一个是否为NULL/ printf("Init ... L->next == NULL\n"); /结果为 等于NULL/
else
printf("Init ... L->next != NULL\n");
}
void Destory(struct node *L){ free(L); }
int main(){ struct node *L; Init(L); if(L->next == NULL) /*判断下一个是否为NULL */ printf("main ... L->next == NULL\n"); else printf("main ... L->next != NULL\n");/结果为不等于NULL/ Destory(L); /释放时出错/ return 0; }
谢谢回答!
void Init(struct node *L){
问题出在这,参数的传递。
只是改变形参的值,没有影响到实参。
可以换用二级指针解决。 ######原来如此,学习啦,谢谢!######因为你传的是指针,取的不是地址,而是指针的指针。所以两处的L不是同一个地址,自然有千奇百怪的错误######我理解错了,还以为是传指针就是把地址传过了,谢谢!###### 我帮你改了一下
改了两函数,你主要错在把值传递当成引用传递用了。C只有值传递,而你想要的是引用传递。只能将要传的引用变成值传过去。关于值传递和引用传递,可以看C++的资料。看完后,你就会明白你错在哪了。
另外,你那释放函数会有隐患。只会释放L指向的结构体,而不是整个相关联的结构体链表。
还有个建议,if...else...不管多少条语句,都建议用括号括起来。一是直观,不易弄错;二是添加处理语句时,方便。
#include<stdio.h> #include<stdlib.h>
struct node{ int data; struct node *next; };
void Init(struct node **L){ struct node *tempNode; tempNode = (struct node *) malloc(sizeof(struct node)); tempNode->next = NULL; /*next 为 NULL */ *L = tempNode; if((*L)->next == NULL) /判断下一个是否为NULL/ printf("Init ... L->next == NULL\n"); /结果为 等于NULL/
else
printf("Init ... L->next != NULL\n");
}
void Destory(struct node **L){ struct node * temp = NULL; if(*L != NULL){ //L!=NULL才释放 do{ temp = (*L)->next; free(*L); *L = temp; }while(*L != NULL); } }
int main(){ struct node *L; Init(&L); if(L->next == NULL){ /*判断下一个是否为NULL */ printf("main ... L->next == NULL\n"); } else{ printf("main ... L->next != NULL\n");/结果为不等于NULL/ } Destory(&L);
return 0; }
######学习了!我之前理解错了,非常感谢你的建议和修改!######回复 @中山野鬼 : 你说的对,只是题主的主要问题不在这,所以我没改题主的这个输出测试。######子函数的判断毫无必要,主函数的判断有意义。哈。######
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。