提供されたテキストは、文字ポインター(char *string
)とキャラクター配列(char string[]
)を使用して文字列を保存および変更することの違いを説明しています。
例1(セグメンテーション障害):
<code class="language-c">#include <stdio.h> int main(void) { char *string = "Wello, world!"; // string is a pointer string[0] = 'H'; // Attempting to modify a read-only string puts(string); }</code>
はキャラクターに対してstring
ポインターとして宣言されるためです。 このポインターは、通常、読み取り専用メモリに保存される文字列(「Wello、World!」)を指すように初期化されます。 この読み取り専用メモリの内容を変更しようとすると、セグメンテーション障害が発生します(メモリアクセス違反)。
このコードは「Hello、World!」に正常に印刷されます。 ここでは、
<code class="language-c">#include <stdio.h> int main(void) { char string[] = "Wello, world!"; // string is an array string[0] = 'H'; // Modifying a writable copy of the string puts(string); }</code>
文字配列string
として宣言されています。コンパイラは、スタック上のスペースを割り当てて、文字列のコピーをリテラルに保持します。 このコピーは書き込み可能で、エラーを引き起こすことなくの変更を可能にします。
string[0]
キーの違い:
基本的な違いは、文字列の保存方法にあります。 例1では、文字列の文字通りは読み取り専用メモリにあり、ポインターは単にそれを指しています。例2では、文字列リテラルの書き込み可能なコピー
が作成され、スタックの配列に保存されます。結論:
ポインターと配列は、Cの異なるデータ型です。一部のコンテキストでは似ているように見える場合がありますが、特に文字列リテラルを扱う場合、動作は大きく異なる場合があります。 予期しないエラーやセグメンテーション障害を避けるために、常にこの区別に注意してください。 変更可能な文字列に文字配列を使用すると、文字列に文字列を使用するよりも一般的に安全です。
以上がC での文字列の代入の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。