【发布时间】:2016-04-22 15:03:13
【问题描述】:
使用 malloc() 分配的内存在被释放后究竟会发生什么? 假设我执行以下操作...
int main(){
int * arr;
arr=(int*) malloc(sizeof(int)*20);
int i;
for(i=0;i<20;i++) arr[i]=2*i+1;
int * tmp=arr;
for(i=0;i<20;i++) printf("%d ",*(tmp+i));
printf("\n");
free(arr);
for(i=0;i<20;i++) printf("%d ",*(tmp+i));
return 0;
}
我得到了输出...
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
0 0 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
为什么前两个条目会改变(而其他条目没有)?
【问题讨论】:
-
一旦内存被释放,它可以被重新使用。仅仅因为您自己的代码没有显式更改该内存,并不意味着 C 内部更深层次的其他内容无法执行自己的 malloc 并获取部分/全部释放的块。
-
如果您有时间,请阅读此stackoverflow.com/a/6445794/434551。之后理解指针会容易很多。
-
释放的块可能通过 free() 调用加载了堆管理元数据。
-
"为什么前两个条目会改变" --> 除了好奇之外,您为什么还要想知道发生了什么?为什么数据保持不变或发生变化很重要?
-
请注意,“未定义行为”并不意味着“随机”。它的意思是“这取决于我们不应该关心的一些代码”。是的,这个问题背后可能有一个原因,但考虑它是不合理的。
标签: c memory memory-management free