问题描述
- C语言中存储空间分配问题
-
看书上说声明的变量只是在函数存在的时间有效,函数返回时就会被释放。
然后我就试了一下,代码如下:#include<stdio.h> int f(int **iptr) { int a=10; *iptr=&a; return 0; } int main() { int **jptr; f(jptr); printf("%i ",**jptr); }
按理说不应该是f函数结束后变量a就会被释放,此时*iptr应该是一个悬空指针啊,为什么我编译运行程序的时候
还是可以输出a的值为10,谢谢啦,这里不是很理解。
解决方案
释放并不代表清空该内存。
只是将此内存归还给操作系统。
指向的内存标记为*可用*,操作系统掌控,内容没有意义.不会主动变化(清0).直到再次分配后可能又会用到这部分.
(可能也和内存分配回收策略有关,出于效率考虑)
楼主这样的做法属于未定义的行为,如果你访问的区域已经重新被别的变量使用,那么可能导致程序崩溃
解决方案二:
的确是释放了,但是不会被清零。因为你没有调用别的函数,堆栈收缩了,所以堆栈顶上的值没有被别的数据覆盖,还能访问。
解决方案三:
释放和清零是两个概念,释放只是说明这个内存可以被再次使用,好比你删除文件。文件删除了,但是写文件的扇区不会被清零,如果没有新的数据写入,你还可以用文件恢复软件找回删除的文件。
解决方案四:
C语言的指针可以随便访问,它才不管这些内存是否合法,不要说访问释放过的内存,就是压根没有申请的内存都可以:
int x = 1;
int *p = &(x + 1); //明显这个指针指向的这个地方根本不是一个变量。
解决方案五:
C语言的指针可以随便访问,它才不管这些内存是否合法,不要说访问释放过的内存,就是压根没有申请的内存都可以:
int x = 1;
int *p = &x + 1; //明显这个指针指向的这个地方根本不是一个变量。
解决方案六:
1.a 是被释放了没有错的;
2. f 传参是传入的一个地址,在里面把a的地址给它了;
3.所以你后面输出的就是在f里传来的值;
解决方案七:
【C语言】结构体存储与空间分配
C语言 结构体存储空间分配
时间: 2024-11-10 00:32:10