4

昨日、自家製の「strcpy」関数で少しトラブルがありました。それは今でも動作しますが、私は少し混乱しています!

char* a = "Hello, World!"; //Works
char b[] = "Hello, World!"; //Works also

strcpy(a, "Hello!"); //Segmentation fault
strcpy(b, "Haha!!"); //Works..

違いはどこにありますか?char ポインターによって「セグメンテーション違反」が発生するのはなぜですか?

なぜこれが機能するのですか?:

char* a = "Haha"; //works
a = "LOL"; //works..
4

2 に答える 2

13
char* a = "Hello, World!";

文字列リテラルへのポインタを提供します。文字列リテラルは読み取り専用メモリに存在する可能性があるため、その内容を変更することはできません。

char* a = "Haha"; //works
a = "LOL"; //works..

a別の文字列リテラルを指すようにポインターを変更します。どちらの文字列リテラルの内容も変更しようとしないため、安全/正確です。

char b[] = "Hello, World!"

スタック上で配列を宣言し、文字列リテラルの内容で初期化します。スタック メモリは書き込み可能であるため、このメモリの内容を変更しても完全に安全です。

于 2013-05-22T13:21:27.370 に答える
1

最初の例では、a が指す読み取り専用メモリに書き込もうとしているため、セグメンテーション違反が発生します。ポインタを使用する場合は、メモリをヒープに割り当て、使用後に削除します。b は、「Hello, World!」で初期化された文字の配列です。

2番目の例では、別の文字列リテラルを指すポインターを作成していますが、これは問題ありません。

于 2013-05-22T13:27:44.343 に答える