C - free()不会释放整个数组

时间:2017-06-30 15:41:10

标签: 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;
}

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

12 15 100 101 102 103 109 999 完成自由。 0 0 100 101 102 103 109 999

1 个答案:

答案 0 :(得分:3)

当您调用free时,您只是告诉操作系统您已完成该内存块。你保证不再使用它。如果你打破了这个承诺,这就是你的问题。

重要的旁注:

调用if(ptr)if(NULL != ptr)不会测试ptr是否指向已分配的内存块。它只测试它是否指向任何东西。调用free不会为任何指针指定null。你必须手动处理。我很难学到这一课......

重要的旁注2:

没有一般方法可以确定是否分配了内存ptr。有些平台提供此功能,但不是全部。

现在,也许你想知道,如果free(ptr)为ptr分配NULL,会不会更好?也许,也许不是。缺点是它的安全性很差。请考虑以下代码:

int *p1=malloc(sizeof(int));
int *p2=p1;
free(p1);

您期望p2有什么价值?最好还是了解指针实际意味着指针是否为空。