-
今天在复习链表这种数据结构必須利用指针变量时遇见了几个问题其实是拖了很久的问题,现在尝试分析一下
在主函数里定义了一个Node类型的指针并赋值NULL,然后调用CreatNode函數试图用一个新的节点来对它赋值以完成对第一个节点的初始化操作。
本以为会输出0但结果却是程序崩溃了,为何
先把这个问题放┅边,来看另一段代码:
这段代码可以成功运行对比前一段代码,可以看不同:
- 后一段代码是list来接收返回值前一段是将list当成参数传入
泹为啥运行结果天差地别呢?
分析:第二种情况用list接收一个返回值这是一定能成功的,在函数中malloc了一个Node空间,然后将其地址返回如此list的值就等于这个Node的地址了;
第一种情况是将list作为参数传入,我们知道一旦涉及参数,就会有形参和实参也就是说会有一个list的副本。这个副本和实参在数值上相等但地址不同,所以如果在函数里修改这个副本的值是没有办法同步到实参的只能通过地址来操作徝才能使形参和实参同步。因此传了list之后,会有一个形参list它们的值(现在是NULL)相同,但地址不同
而我们是想改变主函数中list的值,那么在函数中直接修改值肯定是不行的那只是修改了副本的值,等函数执行完毕后副本(在这个程序里是head)和pNew都会被回收。所以这么做不僅达不到修改主函数中list值的目的反而还会造成内存泄漏( 因为,副本和pNew都被回收没有其他指针指向申请的内存空间了 )。 -
其实想一想是很簡单的想要在函数里改变变量的值我们就得传地址;想要改地址的值,我们就得传地址的地址在这个例子里面,我们不过是想改变主函数中指针的值而已自然得传指针的地址。正确的代码如下:
-
2020年1月5日于实验室这几天想复习一下指针,正好看到链表这种数据结构必須利用指针变量这里于是想起了此前一直被困扰的问题。其实不难只不过是被指针给吓到了,本质上还是传值和传址