我写了这段代码,看看在我分配了一些内存之后会发生什么,但我不能理解这里发生了什么。
程序要求用户输入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]);
}
}
答案 0 :(得分:4)
我理解它的方式是,一旦记忆被“释放”,就可以了 存储在其中的先前内容将被删除,而不是 被一些随机数替换。
不,那不是真的。释放内存后,它就可用,您可以将其用于将来的内存分配。没有任何东西可以在释放内存后用随机数替换内存。这是完全错误的。
答案 1 :(得分:0)
正如之前的海报所说,一旦你释放它,你的记忆就不会被随机覆盖。 如果你真的想要这个,那么Linux内核的PaX Patchset就有了CONFIG_PAX_MEMORY_SANITIZE,它正是这样做的。
答案 2 :(得分:0)
释放malloc()
'ed指针后,再次取消引用该指针是未定义的行为。
返回的值可能与以前相同,也可能不同。该程序可能会出错。很多可能性。行为未定义。