c/c++语言创建单链表新结点时为什么不直接用结点对象,如直接lnode p;而是非要用指针加malloc或new实现?

如题所述

因为直接创建,节点作为局部变量,将位于堆栈上,等创建节点的函数返回主函数,这些节点也完蛋了。所以要创建在生命期和程序一样长的堆里面。这个任务由malloc或new来完成追问

非常感谢!不过我记得还有一个说法,就是自定义类型或结构体不能像int a一样自动申请内存?所以才需要手动申请??但这样的话又和您的回答有些许冲突,从您的回答来看不存在不会自动分配内存的问题,而是会分配到栈中,所以我又迷糊了

追答

你可以尝试一下,看看正确的答案究竟是什么

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-09
因为你在函数内创建的结点对象是临时对象,在它的作用域外它就释放了,你再用链表去指向它就出错了(指向了一个已释放的地址),而动态分配的内存,不会自动释放,需要你需要的时候手动释放free(ptr)追问

非常感谢!不过我记得还有一个说法,就是自定义类型或结构体不能像int a一样自动申请内存?所以才需要手动申请??但这样的话又和您的回答有些许冲突,从您的回答来看不存在不会自动分配内存的问题,而是会分配到栈中,所以我又迷糊了

追答

你的那个说法是错误的
struct node {};
struct node mynode; //这里就是自动分配的内存
如同:
int a =208; //以上两个都不需手动释放,因为是自动分配的
又:
int *a =(int*)malloc(sizeof(int));
struct node *ad =(struct node*)malloc(sizeof(struct node));
这两个就需要手动释放,因是自己主动在堆上申请的:
free(a);free(ad);

相似回答