使用free在C中释放非char指针

时间:2017-09-07 16:05:18

标签: c pointers malloc free

在阅读article时,我看到了这一段:

  

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

int *p = (int *) malloc(...); ... free(p);
     

此代码可能在int *和char *所具有的体系结构中出现故障   不同的表示因为free需要后者的指针   类型。

这不是我第一次看到free期望char*类型。

我的问题是,如何免费p

1 个答案:

答案 0 :(得分:4)

注意You should not cast the return value of malloc in C

这个问题说明了阅读潜在无效资源的危险。确保您阅读的资源准确无误非常重要!有问题的OP资源,其时代并没有错误,但已过时,因此无效。 K& R 2E具有讽刺意味的是一年之久,但仍然非常日期(因此仍然强烈推荐),因为它符合标准。

如果我们咨询a more reputable resource (the free manual),我们可以看到free实际上希望指针属于void *类型:

void free(void *ptr);

......以及它的价值,here's the malloc manual showing that malloc returns void *

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

注意(如果您第一次错过了它):You should not cast the return value of malloc in C。毕竟,当你把它传递给free时,你不需要把它投射出来,对吧?