我有一个指向int的指针,在我调用free之后,我看到只有前两个元素被释放,其余元素保持不变。有人可以解释一下吗?
int main() {
int* a = (int*)malloc(10*sizeof(int));
a[0] = 12;
a[1] = 15;
a[2] = 100;
a[3] = 101;
a[4] = 102;
a[5] = 103;
a[6] = 109;
a[7] = 999;
printf("%d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
free(a);
printf("Done freeing.\n");
printf("%d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
return 0;
}
输出:(抱歉将所有输出放在一行中)
12 15 100 101 102 103 109 999 完成自由。 0 0 100 101 102 103 109 999
答案 0 :(得分:3)
当您调用free
时,您只是告诉操作系统您已完成该内存块。你保证不再使用它。如果你打破了这个承诺,这就是你的问题。
重要的旁注:
调用if(ptr)
或if(NULL != ptr)
不会测试ptr
是否指向已分配的内存块。它只测试它是否指向任何东西。调用free
不会为任何指针指定null。你必须手动处理。我很难学到这一课......
重要的旁注2:
没有一般方法可以确定是否分配了内存ptr
。有些平台提供此功能,但不是全部。
现在,也许你想知道,如果free(ptr)
为ptr分配NULL,会不会更好?也许,也许不是。缺点是它的安全性很差。请考虑以下代码:
int *p1=malloc(sizeof(int));
int *p2=p1;
free(p1);
您期望p2有什么价值?最好还是了解指针实际意味着指针是否为空。