【发布时间】:2016-10-19 17:01:58
【问题描述】:
我不知道是我做错了什么,还是我的概念有些错误
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p;
p=calloc(3,sizeof(int));
p[0]=10;
p[1]=15;
p[2]=30;
printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2);
free(p);
//p=NULL;
printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2);
return 0;
}
当第二次运行 printf() 时,它显示 p[2]=30,而 p[0]=p[1]=0(在 gcc ubuntu 和 Code::Blocks 窗口中的一些任意值)。我有 2 个问题。
- 为什么 free() 释放前 2 个指针而不是第 3 个。一个?
- 为什么在 ubuntu 中显示任意值似乎正确,但值却显示为 0?
我是初学者,请多多包涵。我用 malloc() 尝试过同样的事情,同样的事情发生了。
【问题讨论】:
-
free已释放内存。但它并没有神奇地消失。它只是还没有被另一个进程或函数重用。而且没有 3 个指针,只有 1 个。 -
如果内存真的是空闲的()-d p[3] 如何保留它的原始值?我同意这是未定义的行为,因此它应该给出任意值,对吧?
-
@StephenStemmer 任意定义。
-
@StephenStemmer
freeing 内存使其可供重复使用,仅此而已。这并没有给它“任意值”。它只是可供重复使用,并且任何写入它的值 then 对所有意图而言都是任意的,就您继续使用而言。部分或全部可能已在printf内重新分配。但推测是没有用的。 -
呵呵,确实有任意值。你怎么知道它是否是任意的?
标签: c malloc free dynamic-memory-allocation calloc