我有一种情况,在void指针内部的地址中被复制到另一个指针。如果不进行类型转换,则不会发出警告或错误。伪代码看起来像将void指针的值赋给非空指针
structA A;
void * p = &A;
structA * B = p;// Would like to conform this step
我没有预见到任何问题。 但是由于这个操作使用了很多地方,我想确认它是否可以有任何复制。还有什么编译器依赖?
我有一种情况,在void指针内部的地址中被复制到另一个指针。如果不进行类型转换,则不会发出警告或错误。伪代码看起来像将void指针的值赋给非空指针
structA A;
void * p = &A;
structA * B = p;// Would like to conform this step
我没有预见到任何问题。 但是由于这个操作使用了很多地方,我想确认它是否可以有任何复制。还有什么编译器依赖?
不,这很好,100%的标准。
A void *
可以毫无问题地转换成任何其他数据/对象指针并从中转换。
注意,数据/对象限制:函数指针不转换到/自void *
。
这就是为什么you shouldn't cast the return value of malloc()
,它返回void *
。
在C a void *
隐式兼容任何指针。这就是为什么你不需要投掷,例如将任意类型的指针传递给参数为void *
的函数,或者在返回函数返回void *
(这里是malloc
就是一个很好的例子)的指针(仍然是任何类型)时分配指针。
任何* object *指针,我会说。 –
请参阅http://stackoverflow.com/questions/15745030/type-punning-with-void-without-breaking-the-strict-aliasing-rule-in-c99 –
“是否符合复制条件”?为什么不使用简单的英语:“我想检查它是否有效。” –
我已经测试了一些伪代码,它工作正常。仍然问题是为了符合没有任何隐藏问题的可能性.....对不起,如果这造成了混乱 –