C - free() 没有释放整个数组

C - free() is not freeing the entire array

我有一个指向 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

当您调用 free 时,您只是告诉 OS 您已完成该内存块。你保证不再使用它。如果你违背诺言,那是你的问题。

重要旁注:

调用 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 具有什么价值?最好了解指针 is/isn't NULL.

的实际含义