私は次のコードを持っています:
#include <iostream>
using namespace std;
int main()
{
char* a = "foo";
char* b = "bar";
a = b;
cout << a << ", " << b << endl;
return 0;
}
これはコンパイルして動作します。印刷しbar, barます。ここで、ここで行われているのは文字列のコピーではないことを示したいと思います。b私は変化し、それも変化することを示したいと思いaます。私はこの簡単なコードを思いつきました:
#include <iostream>
using namespace std;
int main()
{
char* a = "foo";
char* b = "bar";
a = b;
b[1] = 'u'; // ← just this line added
cout << a << ", " << b << endl;
return 0;
}
...しかし、それはセグメンテーション違反です。なんで?興味深いことに、次の変更は問題なく実行されます。
#include <iostream>
using namespace std;
int main()
{
char* a = "foo";
char b[] = "bar"; // ← declaration changed here
a = b;
b[1] = 'u';
cout << a << ", " << b << endl;
return 0;
}
前のようにセグメンテーション違反にならないのはなぜですか? ポインター スタイルと配列スタイルの文字列初期化の間に重要な違いがいくつか欠けていると思います。