使用 free 在 C 中释放非字符指针



在阅读本文时,我遇到了这一段:

指向对象的指针可能具有相同的大小,但格式不同。这 由下面的代码说明:

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时,你不需要投射它,对吧?

相关内容

  • 没有找到相关文章

最新更新