我有如下的代码:
#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;
}
为什么它不像以前那样出现段错误?我猜我漏掉了指针风格和数组风格字符串初始化之间的一些重要区别。