我的自由工作正常吗?

时间:2014-07-09 09:09:18

标签: c free

我写了这段代码,看看在我分配了一些内存之后会发生什么,但我不能理解这里发生了什么。

程序要求用户输入3个(通过键盘)。然后打印出输入的每个输入以及存储它们的内存。该程序然后释放'分配的内存并从相同的内存地址重新打印出新内容。

我理解的方式是,一旦内存被释放,存储在其中的先前内容将被删除,而是被一些随机数替换。这发生在ptr的前两个地址中,但由于某种原因,我输入的第三个数字仍然存储在'& ptr [2]'甚至在我自由(ptr)之后。这里发生了什么?为什么它不会像使用malloc()之前那样恢复为随机数?

另外我想问一下,在malloc部分之后,(ptr)与(& ptr [0])完全一样???

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

main ()
{
    int *ptr;
    int req = 3;
    int i;

    ptr = malloc (req * sizeof(*ptr));

    for (i=0; i<req ; i++)
    {
        printf("Please enter a number: ");
        fflush(stdin);
        scanf("%d", &ptr[i]);
    }

    for (i=0; i<req; i++)
    {
        printf("Number #%d is %d and stored in memory address %d\n", (i+1), ptr[i], &ptr[i]);
    }

    free(ptr);

    for (i=0; i<req; i++)
    {
        printf("Number #%d is %d and stored in memory address %d\n", (i+1), ptr[i], &ptr[i]);
    }

}

3 个答案:

答案 0 :(得分:4)

  

我理解它的方式是,一旦记忆被“释放”,就可以了   存储在其中的先前内容将被删除,而不是   被一些随机数替换。

不,那不是真的。释放内存后,它就可用,您可以将其用于将来的内存分配。没有任何东西可以在释放内存后用随机数替换内存。这是完全错误的。

答案 1 :(得分:0)

正如之前的海报所说,一旦你释放它,你的记忆就不会被随机覆盖。 如果你真的想要这个,那么Linux内核的PaX Patchset就有了CONFIG_PAX_MEMORY_SANITIZE,它正是这样做的。

答案 2 :(得分:0)

释放malloc()'ed指针后,再次取消引用该指针是未定义的行为。

返回的值可能与以前相同,也可能不同。该程序可能会出错。很多可能性。行为未定义。