malloc()和free()的使用问题

3

感谢您注意到我的问题。

在C Primer Plus中,首先写道:

free()的参数应该是由malloc()分配的内存块的指针;您不能使用free()来释放其他方式分配的内存。

这意味着只有一个malloc(),一个且仅有一个free()

但是后来它又说:

使用与malloc()不同的指针变量使用free()没有问题;必须一致的是指针中存储的地址。

这似乎与第一个声明相矛盾。

因此,我的理解是只要一对malloc()free()共享相同的地址,就不会出现错误,指针的名称并不重要。我理解正确吗?


"传递给free()的参数应该是...是错误的。它必须是。指针并不是它指向的对象!" - too honest for this site
3个回答

13

例如:

void* p = malloc (100);
void* q = p;
free (q);

...是好的。free() 的参数是由 malloc 返回的值。这句话:

"使用与 malloc() 不同的指针变量调用 free() 是可以的"

实际上是没有意义的,只会造成混淆 - 只要值相同,使用不同的变量是可以的。


谢谢,这本书似乎有很多冗余的描述,比如这个。 - Newb

5
只需记住,释放任何别名将使所有指针无效。
int *a, *b, *c, *d, *e;
a = malloc(42 * sizeof (int));
b = a;
c = b;
d = c;
e = d;
a[0] = 42;
b[1] = 100; // same as a[1]
c[2] = 999; // same as a[2]
d[3] = -1;  // same as a[3]
e[4] = 0;   // same as a[4]
free(d); // for example
// all of a, b, c, d, and e are now invalid;

2

变量包含某些值,这些值可能是指针(即内存地址)。

两个变量可以包含相同的指针(即相同的地址),这被称为指针别名。

free关心的是获得先前由malloc给出的指针的值(即先前由malloc给出的内存地址)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接