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

2 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] = 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:(抱歉将所有输出放在一行中)

12 15 100 101 102 103 109 999 释放完毕。0 0 100 101 102 103 109 999

klu*_*utt 5

当您调用 时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);
Run Code Online (Sandbox Code Playgroud)

您期望 p2 具有什么值?最好了解指针是/不是 NULL 的实际含义。