Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这个数组在释放后仍然存在?_C_Pointers_Malloc_Free - Fatal编程技术网

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

C 为什么这个数组在释放后仍然存在?,c,pointers,malloc,free,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=

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

使用
free
释放对象后访问该对象将调用未定义的行为。不要这样做

即:

for (i=0; i < imax; i++)
{
    printf("%d ",b[i]);  // invokes undefined behavior!
}
(i=0;i { printf(“%d”,b[i]);//调用未定义的行为! } 如果你运气不好,什么事都不会发生,但从撞车到鼻魔,一切都可能发生。

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

  • 内存读取是完全相同的,因为C库只是将其标记为空闲,而没有触摸它
  • 内存读取是垃圾,因为其他东西重用了新释放的块
  • 您的程序崩溃,因为地址不再可接受
  • 你的电脑会发射一枚核导弹飞向南极洲,因为嘿,任何行为都是不确定的
    所以,为了可爱的小企鹅,请避免阅读释放的记忆

    这个问题大约有5000个重复。除了Drew关于避免读取空闲内存的评论。通常,在空闲时间之后将指针设置为null是一种很好的做法。
    for (i=0; i < imax; i++)
    {
        printf("%d ",b[i]);  // invokes undefined behavior!
    }