c - 被 malloc() 分配后释放的内存会发生什么?

标签 c memory memory-management free

释放后使用 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 

为什么前两个条目改变了(而其他的没有改变)?

最佳答案

Why do the first two entries change(and the others don't)?

长话短说 undefined behavior .


一旦您在之前由 malloc() 返回的指针上调用了 free(),该指针就不再有效程序上下文。尝试使用它调用 undefined behavior .

谈到实际内存发生了什么,好吧,这也取决于环境。调用 free() 只是一种通知下层(操作系统/内存管理器)可以回收和重用内存的方式如果需要/强>。没有任何内容强制必须清理(清零)或类似的内存位置。

关于c - 被 malloc() 分配后释放的内存会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36797297/

相关文章:

c - 将结构成员指针分配给另一个动态内存分配指针是否安全?

Objective-C 引用计数和自动释放

performance - Go:通过 slice slice (二维 slice )访问数组时出现意外性能

C++ 避免两次删除内存

c - 为什么函数原型(prototype)后需要使用分号

c - 测试多个数组元素

c - 从 GDB 解码 ARM 指令

c++ - Windows 中的网络文件传输

c - 如何在 mac OSX 中查找内存使用情况?

python - 在脚本调用之间保留 Python 变量