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

Patricia Arquette
リリース: 2024-10-31 11:22:29
オリジナル
290 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート