释放后使用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
为什么前两个条目会改变(其他条目不会改变)?
答案 0 :(得分:2)
为什么前两个条目会改变(其他条目不会改变?)
TL; DR undefined behavior。
在free()
之前返回的指针上调用malloc()
后,该指针在程序上下文中不再有效。尝试使用它会调用undefined behavior。
即将到来实际内存会发生什么,这也是依赖于环境的。调用free()
只是告知下层(操作系统/内存管理器)可以回收并重用内存 (如果需要 )的方法。 强制没有必要清理(归零)或类似内存位置。
答案 1 :(得分:0)
malloc
,free
和realloc
函数管理传统上称为&#34;堆&#34;的内存区域。 malloc
和realloc
选择堆的一个区域,将其标记为&#34;在使用&#34;中,并向您返回指向内存的指针。 free
会将内存返回给堆,供将来的malloc
和free
来电使用。
当free
将内存返回到堆中,并将其标记为程序不再使用时,可能是它标记的方式之一涉及在内存中设置位。在您的情况下,这就是为什么您的某些数组值发生了变化。
(但当然,你不能依赖于此。其他实现可能会使现在释放的内存完全保持不变。其他人可能已完全删除它。而且你的程序也可以在释放后尝试打印内存时崩溃了,因为你当然不应该这样做。)