2017-02-17 5 views
1

Cで、どのポインタ型もvoid *で往復できることは保証されていますか? Aすべてのポインタはvoid *を使って往復することが保証されていますか?

typedef struct { 
... 
} A; 

A *p = ...; 
void *v = p; 
A *p2 = v; 
// use p2 here 

を問わずどのようなタイプ:、仕事に保証次のようなものがある

+3

オブジェクトポインタのみ。関数ポインタではありません。 –

+0

はい、関数を 'void *'にキャストしないでください。構造体にラップする必要があります。 –

答えて

5

オブジェクトポインタは実際にはvoid*を介してラウンドトリップすることができます。 C11から6.3.2.3段落1:

voidへのポインタは、任意のオブジェクト型へのポインタに変換することができます。 のオブジェクト型へのポインタは、voidへのポインタに変換され、再び戻されます。結果は と元のポインタを比較します。

voidポインターをオブジェクトポインターに変換して戻したとき、最初のものと同じ値が保証されていないことに注意してください。

また、これはではなく、関数ポインタの真であることにも注意してください。しかし、すべての関数ポインタ型は、互いに丸trippableある:段落8は言う:

一種の関数へのポインタが再び別の タイプの関数へのポインタに変換してもよいです。結果は元のポインタと等しいとみなされます。

オブジェクト型へのポインタに変換することができる。

はまた、オブジェクトポインタもパラグラフ7によって、(ボイドポインタを伴わない)それらの間trippableラウンドいくつかの制約を受けています別のオブジェクト型へのポインタ。結果のポインタが正しく整列されていない場合)、その動作は未定義です。さもなければ、再び変換されたとき、結果は元のポインタと等しいと比較される。

+0

'void * 'を使ってラウンドトリップすると、同じポインタが生成されます。 IAC、OPは同等のアクセスにのみ関心があるようです。 – chux

+0

任意の型へのポインタは、他の型に変換して戻すことができ、配置が違反されていない限り、元のポインタと等しいと比較されます。 – 2501

+0

@ 2501:引用が必要です。 –

関連する問題