2014-04-02 86 views
0

我有一种情况,在void指针内部的地址中被复制到另一个指针。如果不进行类型转换,则不会发出警告或错误。伪代码看起来像将void指针的值赋给非空指针

structA A; 
void * p = &A; 
structA * B = p;// Would like to conform this step 

我没有预见到任何问题。 但是由于这个操作使用了很多地方,我想确认它是否可以有任何复制。还有什么编译器依赖?

+1

请参阅http://stackoverflow.com/questions/15745030/type-punning-with-void-without-breaking-the-strict-aliasing-rule-in-c99 –

+0

“是否符合复制条件”?为什么不使用简单的英语:“我想检查它是否有效。” –

+0

我已经测试了一些伪代码,它工作正常。仍然问题是为了符合没有任何隐藏问题的可能性.....对不起,如果这造成了混乱 –

回答

4

不,这很好,100%的标准。

A void *可以毫无问题地转换成任何其他数据/对象指针并从中转换。

注意,数据/对象限制:函数指针转换到/自void *

这就是为什么you shouldn't cast the return value of malloc(),它返回void *

1

在C a void *隐式兼容任何指针。这就是为什么你不需要投掷,例如将任意类型的指针传递给参数为void *的函数,或者在返回函数返回void *(这里是malloc就是一个很好的例子)的指针(仍然是任何类型)时分配指针。

+0

任何* object *指针,我会说。 –