void ポインター: C と C の間の違いを明らかにする
void ポインターに関しては、C と C は異なる動作を示します。この問題は、void* 戻り値を void 以外のポインターに割り当てることの許可を中心に展開しています。
C では、エラーなしでコンパイルされる次のコードに示されているように、そのような代入が許可されています。
<code class="c">int* p = malloc(sizeof(int));</code>
ただし、 C では同じコードがコンパイルに失敗し、 C でのより厳密な型チェックが強調されます。この不一致は、void ポインターの処理方法の違いに起因します。
C では void と他のポインター型の間の暗黙的な変換が許可されていますが、C ではこの自由が制限されています。 C では、 void から特定のポインター型への変換には明示的なキャストが必要です。したがって、次のコードを C でコンパイルするにはキャストが必要です:
<code class="c++">int* p = (int*) malloc(sizeof(int));</code>
この違いにもかかわらず、C では非 void ポインターから void* への暗黙的な変換が許可されています。この機能は、次のコードで明らかです。
<code class="cpp">void foo(void* vptr) { } int main() { int* p = (int*) malloc(sizeof(int)); foo(p); return 0; }</code>
このコードは、C と C の両方で問題なくコンパイルされます。その理由は、void の固有の柔軟性とポインターの性質にあります。情報を失うことなく、任意のオブジェクト ポインターを安全に void に変換できます。 void* が元のポインター型に変換されて戻されると、正確なポインターが復元されます。これは、K&R2 からの引用で説明されています:
「オブジェクトへのポインタは、情報を失うことなく void * 型に変換できます。結果が元のポインタ型に変換し戻されると、元のポインタが復元されます」 ."
以上がC では `void*` を非 Void ポインターに代入できないのに、C では代入できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。