void* は常に char* と同じ表現になりますか? 質問する

void* は常に char* と同じ表現になりますか? 質問する

void*常に と同じ表現になりますかchar*?

詳細:

次のように char* を受け取り、それを a で終了する可変引数関数を操作したいと思います(char*)0

int variadic(char*, ...); //<-prototype
variadic("foo", "bar", (char*)0); //<- usage

(char*)0に置き換えたかったのですNULLが、http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdfの:

66) マクロ NULL は (およびその他のヘッダー) でヌルポインタ定数として定義されています。7.19 を参照してください。

3 値が 0 の整数定数式、または void * 型にキャストされたそのような式は、ヌル ポインター定数と呼ばれます。66) ヌル ポインター定数をポインター型に変換すると、結果のポインター (ヌル ポインターと呼ばれます) は、どのオブジェクトまたは関数へのポインターとも等しくないことが保証されます。

できません。文脈上variadic、 が絶対に必要でありchar*、 plain は0受け入れられないからです。

次のように定義した場合:

#define NIL (void*)0 /*<= never a plain 0*/

これを使用して解約することは合法でしょうかvariadic(char*,...)?

ベストアンサー1

C11、§6.2.5、¶28(草案N1570)は言う:

void へのポインターは、文字型へのポインターと同じ表現およびアラインメント要件を持ちます。48) 同様に、互換性のある型の修飾バージョンまたは非修飾バージョンへのポインターには、同じ表現およびアラインメント要件が適用されます。

(強調は私による)。

おすすめ記事