C语言 为什么这个数组在被释放后仍然存在



我正在释放分配给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 

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

  1. 内存读取是完全相同的,因为C库只是将其标记为空闲而不触及它
  2. 内存读取是垃圾,因为其他东西重用了新释放的块
  3. 你的程序崩溃了,因为地址不再被接受。你的电脑向南极洲发射了一枚核导弹,因为任何都有可能产生未定义的行为!

所以,为了可爱的小企鹅,请避免阅读释放内存!

在使用free释放对象之后访问它会调用未定义的行为。别这么做。

:

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

如果你运气不好,什么也不会发生,但从撞车到鼻魔,一切都有可能发生。

相关内容

  • 没有找到相关文章

最新更新