[解決済み] C言語でcharの文字列を修正することは可能ですか?
質問
C言語のチュートリアルやポインタに関する本で数時間格闘していますが、私が本当に知りたいのは、一度作成したcharポインタを変更することが可能かどうかということです。
これは私が試したものです。
char *a = "This is a string";
char *b = "new string";
a[2] = b[1]; // Causes a segment fault
*b[2] = b[1]; // This almost seems like it would work but the compiler throws an error.
では、ポインタのアドレスではなく、文字列の中の値を変更する方法はないのでしょうか?
どのように解決するのですか?
ソース コードに文字列を記述すると、コンパイル時にその値を知る必要があるため、実行ファイルに直接書き込まれます (ソフトウェアを分解して、その中のすべてのプレーン テキスト文字列を見つけるツールがあります)。あなたが
char *a = "This is a string"
と書くと、"This is a string"の場所は実行ファイルにあり、
他の回答者が指摘したように)あなたが行う必要があるのは、読み取り専用でない場所(ヒープ上、またはスタックフレーム内)にそのメモリを作成することです。ローカル配列を宣言すると、その配列の各要素に対してスタック上にスペースが作成され、文字列リテラル (実行ファイルに格納されている) がスタック内のそのスペースにコピーされます。
a
ヒープ上にメモリを確保することで、そのデータを手動でコピーすることもできます。
char a[] = "This is a string";
を使って文字列リテラルをそのスペースにコピーすることもできます。
strcpy()
を使用して領域を確保すると、常に
char *a = malloc(256);
strcpy(a, "This is a string");
を呼び出すことを忘れないでください。
malloc()
を呼び出すことを忘れないでください(メモリリーク)。
基本的に、データがどこにあるかを追跡する必要があります。ソースに文字列を書くときはいつでも、その文字列は読み取り専用です(そうでなければ、実行ファイルの動作を変更する可能性があります。
free()
と書いてから
char *a = "hello";
を
a[0]
. そして、どこか他の場所で
'c'
. の最初の文字を変更することが許されるとしたら、その文字は
printf("hello");
の最初の文字を変更することが許され、コンパイラがそれを一度だけ保存したとしたら (そうすべきです)、その場合
"hello"
が出力されます。
printf("hello");
!)
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
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エラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
C/C++の再定義
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]