在C中如何允许这样做?
int p= (int) malloc (sizeof(int));
我只在 gcc 中编译时收到警告。
警告:从指针强制转换为不同大小的整数 [-Wpointer-to-int-cast]
空指针不能强制转换为基元类型,对吗?
*((int*)(x))//is allowed - assume x is of type void*
但是如何也允许直接强制转换为基元呢?
这不是禁止的,而是实现定义的行为。引用C11
,章节§6.3.2.3
任何指针类型都可以转换为整数类型。除非前面指定, 结果是实现定义的。如果结果无法以整数类型表示, 行为未定义。结果不必在任何整数的值范围内 类型。
这就是编译器发出警告的原因。
也就是说,引用第 7.20.1.4 章,能够容纳对象指针的整数类型,我们有intptr_t
和uintptr_t
。
以下类型指定一个有符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为此类型,然后转换回指向 void 的指针, 结果将等于原始指针:
intptr_t
以下类型指定一个无符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为此类型,然后转换回指向 void 的指针, 结果将等于原始指针:
uintptr_t
话虽如此,为了完整起见,让我补充一点,为什么不将malloc()
和家庭的回报值投C
,有相当多的理由。