C - 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 %dn", 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 %dn", 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时,你只是告诉操作系统你已经完成了那个内存块。你保证不再使用它。如果你违背了这个承诺,那就是你的问题。

重要旁注:

调用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有什么价值?最好了解指针为 NULL 的实际含义。

相关内容

  • 没有找到相关文章

最新更新