「char*」への文字列リテラル変換が C では許可されているのに C では非推奨になっている理由
C では、示されているように、文字列リテラルを「char*」ポインターに直接指定します。以下:
char* p = "abc";
ただし、C 11 以降では、文字列リテラルが変更された場合に未定義の動作が発生する可能性があるため、この暗黙的な変換は削除されました。 C 標準では、§ C.1.1 で、上記の例は現在無効であると明示的に述べています。
この問題に対処するために、C では、明示的なキャストで文字列リテラルを 'char*' ポインタに変換できるようにしています。このキャストは、プログラマが潜在的なリスクを理解し、発生する可能性のある結果に対する責任を受け入れることを明確に示しています。
char* p = (char*)"abc"; // Valid with explicit cast
C の明示的なキャストには、次の 2 つの目的があります。
ただし、明示的なキャストを使用した場合でも、文字列リテラルを 'char' ポインターに代入するのが最善とは考えられていないことに注意することが重要です。 C で練習します。より安全なアプローチは、'const char' ポインターを使用することです。これは、文字列リテラルを変更すべきではないことを明示的に示します。
char const *p = "abc"; // Valid and safe
これにより、文字列リテラルが変更されないことが保証され、未定義の可能性が防止されます。
C では、文字列リテラルから 'char*' ポインタへの暗黙的な変換は、次の理由により引き続き有効です。この動作に依存する大量のレガシー コード。 C で暗黙的な変換を削除すると、かなりの数の既存のプログラムが壊れる可能性があります。
以上がC では文字列リテラルから `char*` への直接変換が許可されているのに、C では非推奨になっているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。