例如:
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
等返回的实际地址,无论其存储位置。系统内部存储了多少内存的记录。你知道多少,因为是你分配了它。