C-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的指针,在调用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;
}
输出:(很抱歉将所有输出放在一行中)

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)
。更改了它。谢谢