开发者社区> 问答> 正文

C语言中NULL 的问题 400 请求报错

在写一段小程序的时候,遇到了问题。
问题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; }

谢谢回答!

展开
收起
kun坤 2020-05-29 15:51:55 655 0
1 条回答
写回答
取消 提交回答
  • 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; }

    ######学习了!我之前理解错了,非常感谢你的建议和修改!######回复 @中山野鬼 : 你说的对,只是题主的主要问题不在这,所以我没改题主的这个输出测试。######子函数的判断毫无必要,主函数的判断有意义。哈。######

    引用来自“月阳131417”的评论

    void Init(struct node *L){ 问题出在这,参数的传递。 只是改变形参的值,没有影响到实参。 可以换用二级指针解决。 哈,你说的没错。不过一般工程做法是返回在函数中创建的指针。至于这个指针是否要传入,有时从接口统一的角度,也是有的,单纯的init是没有必要的。 额外说一句“形参”,“实参”的概念害死人。不知道究竟有多少人懂得里面的差异。还不如告诉别人,函数传入的参数,都是函数调用时创造的副本。哈。 ######我的确是把实参和形参弄混啦,谢谢解答!######哈,第一次回复,受教了######你对参数理解有误。C中的参数传递都是传值的。Init(L)时是把L的值保存到寄存器(或堆栈)然后在Init函数中使用,就像是Init中的局部变量。L是指针型变量,也没初使化,所以这是传的就是个随机值。在Init函数中的L=tempNode;只是改的那个寄存器或堆栈中的局部变量,它在函数结束后被销毁。######这么解释就能理解了,谢谢解答!
    2020-05-29 15:52:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多