У меня есть следующий код:
#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;
}
… но это segfaults. Зачем? Интересно, что следующая модификация работает нормально:
#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;
}
Почему он не похож на предыдущий? Я предполагаю, что упускаю какое-то важное различие между стилем указателя и инициализацией строки в стиле массива.