释放超出指针范围的内存

时间:2019-02-21 21:00:31

标签: c pointers

例如:

char** fn() {
    char *x = (char *) malloc(10 * sizeof(char));
    char **y = (char **) malloc(2 * sizeof(char *));
    gets(x);
    y[0] = x;
    y[1] = &x[5];
    return y;
}

int main() {
    char **p = fn();
    printf("%s, %s\n", p[0], p[1]);
    free(p);
    return 0;
}

现在,我用free(p)释放了分配给y的内存。但这并没有释放分配给x的内存。我无法在fn()中释放它,因为y[0]y[1]仍指向它并将被使用。

那我该如何释放分配给x的内存?

1 个答案:

答案 0 :(得分:1)

您已将内存分配给x,然后将其分配给数组元素

char *x = (char *) malloc(10 * sizeof(char));
//...
y[0] = x;

因此您可以以相同的方式但以相反的顺序释放内存

free(p[0]);
free(p);

free的重要信息是malloc等返回的实际地址,无论存储在何处。分配多少内存的记录由系统内部存储。您知道多少,因为分配的是您。