C中如何允许这样做?
int p= (int) malloc (sizeof(int));
我在gcc编译时只收到警告。
警告:从指针强制转换为不同大小的整数[-Wpointer-to-int-cast]
无法将void指针转换为基本类型吗?
*((int*)(x))//is allowed - assume x is of type void*
但是如何允许直接演绎到原语呢?
答案 0 :(得分:4)
这不是禁止的,而是实现定义的行为。引用C11
,章节§6.3.2.3
任何指针类型都可以转换为整数类型。除非事先指明,否则 结果是实现定义的。如果结果无法以整数类型表示, 行为未定义。结果不必在任何整数的值范围内 类型。
这就是编译器发出警告的原因。
那就是引用第7.20.1.4节,能够保存对象指针的整数类型,我们有intptr_t
和uintptr_t
。
以下类型指定带有任何有效属性的有符号整数类型 指向void的指针可以转换为这种类型,然后转换回指向void的指针, 并且结果将与原始指针进行比较:
intptr_t
以下类型指定无符号整数类型,其属性为any 指向void的指针可以转换为这种类型,然后转换回指向void的指针, 并且结果将与原始指针进行比较:
uintptr_t
话虽如此,为了完整起见,让我补充一点,there is fair amount of reasons on why not to cast the return value of malloc()
and family in C
.。