将malloc转换为基本类型

时间:2016-12-02 06:16:30

标签: c pointers casting malloc

C中如何允许这样做?

int p= (int) malloc (sizeof(int));

我在gcc编译时只收到警告。

  

警告:从指针强制转换为不同大小的整数[-Wpointer-to-int-cast]

无法将void指针转换为基本类型吗?

*((int*)(x))//is allowed - assume x is of type void*

但是如何允许直接演绎到原语呢?

1 个答案:

答案 0 :(得分:4)

这不是禁止的,而是实现定义的行为。引用C11,章节§6.3.2.3

  

任何指针类型都可以转换为整数类型。除非事先指明,否则   结果是实现定义的。如果结果无法以整数类型表示,   行为未定义。结果不必在任何整数的值范围内   类型。

这就是编译器发出警告的原因。

那就是引用第7.20.1.4节,能够保存对象指针的整数类型,我们有intptr_tuintptr_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.