为什么这个数组在被释放后仍然存在?

时间:2014-07-30 18:56:36

标签: c pointers malloc free

我释放分配给b的内存。但我的印象是,在你“释放”它之后,分配的内存会动态消失。但是我没有收到任何关于此代码的错误,即使在释放后,我仍然可以访问分配给b元素的原始值。这怎么可能 ?我该怎么做才能完全删除b

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc,char* argv[])
{
    int i, imax;
    int *b;

    imax=5;
    b=malloc(sizeof(int)*imax);

    for (i=0; i < imax; i++)
    {
        b[i]=i*i;
        printf("%d ",b[i]);
    }

    free(b);
    printf("\n memory freed \n");

    for (i=0; i < imax; i++)
    {
        printf("%d ",b[i]);
    }
    printf("\n");

    return 0;
}

使用gcc编译并运行后的结果

0 1 4 9 16 
 memory freed 
0 1 4 9 16 

2 个答案:

答案 0 :(得分:4)

这是未定义行为的示例。有许多不同的可能性,包括:

  1. 内存读取完全相同,因为C库只是将其标记为免费而不触及它
  2. 内存读取是垃圾,因为其他东西重新使用了新释放的块
  3. 您的程序崩溃了,因为地址不再可以接受。
  4. 你的计算机发射一枚前往南极洲的核导弹,因为嘿,任何都可能有不明确的行为!
  5. 所以,为了可爱的小企鹅,请避免阅读释放的记忆!

答案 1 :(得分:0)

free空闲后访问对象会调用未定义的行为。不要这样做。

那是:

for (i=0; i < imax; i++)
{
    printf("%d ",b[i]);  // invokes undefined behavior!
}

如果你运气不好,什么都不会发生,但一切都可能发生在从崩溃到鼻腔的恶魔身上。