C-在指针的范围之外释放内存



例如:

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, %sn", p[0], p[1]);
    free(p);
    return 0;
}

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

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

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

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

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

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

free的重要信息是malloc等返回的实际地址,无论其存储位置。系统内部存储了多少内存的记录。你知道多少,因为是你分配了它。

最新更新