1. ホーム
  2. c

[解決済み] C言語でcharの文字列を修正することは可能ですか?

2023-03-25 16:37:24

質問

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"); !)