【发布时间】:2014-07-09 09:09:18
【问题描述】:
我写了这段代码,看看在分配内存后释放一些内存后会发生什么,但我不明白这里发生了什么。
程序要求用户输入 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]);
}
}
【问题讨论】:
-
你的理解有误。无需将释放的内存替换为随机数。
-
释放内存只是使其可用于将来的
malloc调用。没有做任何其他事情。 -
好奇:您是如何想到
fflush(stdin);是一件好事? -
我在所有对
scanf的调用之后(或之前)都使用fflush(stdin),这样即使您一次输入多个数字(例如“10 20 22 33”)也只有第一个将读取数字(在本例中为“10”),其余的将被清除。如果我不使用它,ptr 的所有 3 个元素都可以用一个我不喜欢的键盘输入来设置。