C-free()不是释放整个数组
我有一个指向int的指针,在调用free之后,我看到只有前两个元素被释放,其余的保持不变。有人能解释一下吗C-free()不是释放整个数组,c,malloc,free,C,Malloc,Free,我有一个指向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] = 10
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;
}
输出:(很抱歉将所有输出放在一行中)
121510101102103109999
释放完毕。
0 0 100 101 102 103 109 999当你调用
free
时,你只是告诉操作系统你已经处理好了内存块。你保证不再使用它。如果你违背诺言,那就是你的问题
重要旁注:
调用if(ptr)
或if(NULL!=ptr)
不会测试ptr
是否指向分配的内存块。它只测试它是否指向任何东西。调用free
不会将null分配给任何指针。你必须手动处理。我通过艰苦的方式学到了这个教训
重要旁注2:
没有通用的方法来确定点处的内存ptr
是否已分配。一些平台提供了这一功能,但不是全部
现在,也许你想知道,如果free(ptr)
将NULL分配给ptr不是更好吗?也许,也许不是。不利的一面是,这是虚假的安全。考虑这个代码:
int *p1=malloc(sizeof *p1);
int *p2=p1;
free(p1);
您希望p2具有什么价值?最好了解指针为空/非空的实际含义。访问您不拥有的内存,如传递给
空闲的内存,会导致未定义的行为。这会使你的程序格式不正确,无效。但是如果我是malloc'd 10*sizeof(int),我不应该拥有它吗?free并不(必然)改变内存内容,只是你不再拥有它,不应该读或写它。它可以包含任何内容(包括您的电话号码)。是的,@bogdan,该程序拥有它已成功分配的内存,直到它释放内存为止。这就是免费()的目的。释放内存后,不再允许访问、读取或写入该内存。C不保证如果程序试图这样做会发生什么。它当然不能保证内存看起来已经被设置为零。具体取决于实现。从技术上讲,您是在告诉libc
内存已经用完了。值是多少!空值应该是多少?@pat:你可能知道,!NULL
为1。代码可能是ptr!=空
或者可能是!(ptr==NULL)
。更改了它。谢谢