在阅读本文时,我遇到了这一段:
指向对象的指针可能具有相同的大小,但格式不同。这 由下面的代码说明:
int *p = (int *) malloc(...); ... free(p);
此代码在 int * 和 char * 具有的体系结构中可能会出现故障 不同的表示形式,因为自由需要后者的指针 类型。
这不是我第一次读到free
期待char*
类型。
我的问题是,如何释放p
?
注意:不应在 C 中强制转换malloc
的返回值。
此问题说明了读取潜在无效资源的危险。确保您阅读的资源准确非常重要!有问题的 OPs 资源在其时代没有错,但已经过时,因此是无效的。具有讽刺意味的是,K&R 2E比它大一岁,但仍然非常过时(因此仍然强烈推荐),因为它遵循标准。
如果我们查阅更有信誉的资源(free
手册),我们可以看到free
实际上期望指针是void *
类型:
void free(void *ptr);
......对于它的价值,这是显示malloc
返回void *
的malloc
手册:
void *malloc(size_t size);
在这两种情况下,如C11/6.3.2.3p1(C11标准)所述:
指向void 的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针转换。指向任何对象类型的指针都可以转换为指向 void 的指针,然后再转换回来;结果应与原始指针相等。
int *p = malloc(...); // A conversion occurs here; `void *` as returned by malloc is converted to `int *`
free(p); // ... and the reverse of the conversion occurs here, to complete the cycle mentioned in C11/6.3.2.3p1
注意(以防您第一次错过):您不应该在 C 中强制转换malloc
的返回值。毕竟,当你把它传递给free
时,你不需要投射它,对吧?