为什么允许从int转换为void *?

时间:2015-04-23 07:22:54

标签: c pointers casting

为什么在C中允许从void*转换为int,反之亦然? 除了pthread以外,它在哪里使用?

2 个答案:

答案 0 :(得分:5)

允许,但行为是实现定义的。

有时,在某些情况下(在特定平台/架构上),此条款可能对于使用运算符的快速和脏黑客/技巧有用需要int个操作数。 [例如:XOR操作]。对于有限内存嵌入式设备的内存优化非常有用。

引用有关功能的标准,

  

将指向整数或整数的指针转换为指针的映射函数旨在与执行环境的寻址结构保持一致。

相关阅读:来自c11,第6.3.2.3章,

第5段:

  

整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。

和第6段:

  

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

答案 1 :(得分:2)

以下标准参考定义了这些转换。如您所见,它们是实现定义的。如果您知道自己在做什么并且了解自己的平台,则应该进行转换。

  

6.3.2.3指针

     
      
  1. 整数可以转换为任何指针类型。除非事先指明,否则   结果是实现定义的,可能没有正确对齐,可能不指向   引用类型的实体,可能是陷阱表示。

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

  4.