Cで、どのポインタ型もvoid *
で往復できることは保証されていますか? A
のすべてのポインタはvoid *を使って往復することが保証されていますか?
typedef struct {
...
} A;
A *p = ...;
void *v = p;
A *p2 = v;
// use p2 here
を問わずどのようなタイプ:、仕事に保証次のようなものがある
?
Cで、どのポインタ型もvoid *
で往復できることは保証されていますか? A
のすべてのポインタはvoid *を使って往復することが保証されていますか?
typedef struct {
...
} A;
A *p = ...;
void *v = p;
A *p2 = v;
// use p2 here
を問わずどのようなタイプ:、仕事に保証次のようなものがある
?
オブジェクトポインタは実際にはvoid*
を介してラウンドトリップすることができます。 C11から6.3.2.3段落1:
voidへのポインタは、任意のオブジェクト型へのポインタに変換することができます。 のオブジェクト型へのポインタは、voidへのポインタに変換され、再び戻されます。結果は と元のポインタを比較します。
voidポインターをオブジェクトポインターに変換して戻したとき、最初のものと同じ値が保証されていないことに注意してください。
また、これはではなく、関数ポインタの真であることにも注意してください。しかし、すべての関数ポインタ型は、互いに丸trippableある:段落8は言う:
一種の関数へのポインタが再び別の タイプの関数へのポインタに変換してもよいです。結果は元のポインタと等しいとみなされます。
オブジェクト型へのポインタに変換することができる。
はまた、オブジェクトポインタもパラグラフ7によって、(ボイドポインタを伴わない)それらの間trippableラウンドいくつかの制約を受けています別のオブジェクト型へのポインタ。結果のポインタが正しく整列されていない場合)、その動作は未定義です。さもなければ、再び変換されたとき、結果は元のポインタと等しいと比較される。
オブジェクトポインタのみ。関数ポインタではありません。 –
はい、関数を 'void *'にキャストしないでください。構造体にラップする必要があります。 –