如题,先谢谢大神解答。
不会销毁,malloc分配指针指向的内存在堆上,的只能你自己回收。如果是局部变量,只会初始化一次,并且每次赋值,和别的局部变量一样放在堆栈上在函数退出的时候销毁。
不好意思,第二张图片有点小。我再重新传一遍。
我已经写出了正确的代码,即使在这里不被销毁,返回的pHead也只是最后一个结点,遍历之后也只显示最后一个。
但是就是对这个问题有点疑惑。
然后重新试了一次,发现for循环里的变量不会被销毁。。
for循环中的变量i,pTemp,pHead会在for的第一个循环时声明,循环结束时销毁。
在你写的代码中,pHead输出的值不一样的原因是,由于你在for循环外定义了一个pHead,for循环内定义了一个pHead。
你在for中定义pHead变量前打印出的pHead的值打印的是for循环外的pHead值,所以值都一样;在for中定义了pHead后打印的pHead是for循环内的pHead值。
依据楼上大佬的解答,再跟上面贴出的代码对比起来就很明了了。
由于变量 val 在循环内部被 重新声明 一次,所以每次循环结束后就被 销毁。
变量 i 虽然在括号内声明 ,不过相当于 外部声明 的变量 。
至于为什么在for循环内不会出现 重复定义 的错误 ,不太清楚。。
查了一下为什么不会被重复定义的问题,看到了诸多大佬的解答,整理了一下:
因为for是让代码执行很多次,而不是把代码复制很多次。
for的本质是跳转,而不是将内部的代码复制展开,这点**类似函数调用**。
局部变量的生存范围是{ }之间。第二次循环已经出了{ },再次进入{ }了。
在一对{ }里,变量名称不重复就可以了。
在i=0时,有了一个变量a,在i=1时,之前的变量a的生命周期已经结束了,那这个a就是不存在的,又定义了一个a,和之前的a一点关系也没有。至于内存、堆栈的问题,那都是系统的事,不是C#程序员的事,也关心不了。
你需要了解生命周期的概念
并不是你程序运行过程中所有定义的变量都一直保持在堆栈里的
真是那样,你内存很快就溢出了 。
其实你要知道...c#的代码在运行的时候变量都是没名字的..你自己写的那个是给编译器看的.是编译器觉得你写了两个一样的东西他看不懂所以报错了而已。