ホームページ  >  記事  >  バックエンド開発  >  C では `void*` を非 Void ポインターに代入できないのに、C では代入できるのはなぜですか?

C では `void*` を非 Void ポインターに代入できないのに、C では代入できるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-31 11:22:29291ブラウズ

  Why Can't I Assign a `void*` to a Non-Void Pointer in C  , But I Can in C?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。