在阅读article时,我看到了这一段:
指向对象的指针可能具有相同的大小但格式不同。这个 由以下代码说明:
int *p = (int *) malloc(...); ... free(p);
此代码可能在int *和char *所具有的体系结构中出现故障 不同的表示因为free需要后者的指针 类型。
这不是我第一次看到free
期望char*
类型。
我的问题是,如何免费p
?
答案 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
时,你不需要把它投射出来,对吧?