[解決済み】文字列リテラルで初期化された "char *s "に書き込むと、"char s[]"ではなく、セグメンテーションフォールトが発生するのはなぜですか?]
2022-03-28 11:32:31
質問
次のコードは、2行目でseg faultを受ける。
char *str = "string";
str[0] = 'z'; // could be also written as *str = 'z'
printf("%s\n", str);
これは全く問題なく動作しますが
char str[] = "string";
str[0] = 'z';
printf("%s\n", str);
MSVCとGCCでテストしています。
解決方法は?
C言語FAQをご覧ください。 質問1.32
Q : これらの初期化にはどのような違いがあるのでしょうか?
char a[] = "string literal";
char *p = "string literal";
に新しい値を代入しようとすると、プログラムがクラッシュします。p[i]
.A : 文字列リテラル(正式名称は の二重引用符で囲まれた文字列のことで、C ソース)は、2つの微妙な使い分けができます。 といった具合です。
- の宣言のように、charの配列のイニシャライザーとして使用します。
char a[]
初期値を指定します。 は、その配列に含まれる文字(と。 必要であれば、そのサイズも)。- それ以外の場所では、無名の静的な文字の配列に変わります。 そしてこの無名配列は 読み出し専用メモリで、かつ したがって、必ずしも を変更します。式コンテクストでは の場合、配列は一度に ポインタを使用します(第6節参照)。 は、2番目の宣言でpを初期化します。 を指し、無名配列の最初の 要素で構成されます。
一部のコンパイラでは 文字列リテラルが は書き込み可能かどうか(古いバージョンのコンパイルのため コード)、また、いくつかのオプションは 文字列リテラルを形式的に const charの配列として扱われます。 エラーキャッチの向上)
関連
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] C: char pointerとarrayの違い [重複].