У меня есть следующий код:Почему это простое назначение строк segfault?
#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;
}
Почему это не похоже на предыдущий? Я предполагаю, что мне не хватает важной разницы между стилем указателя и инициализацией строки в стиле массива.
Также обратите внимание, что ваш код дает предупреждения о компиляторе, которые объясняют эту проблему: «предупреждение: устаревшее преобразование из константы строки в« char * »» – schnaader
g ++ -Wall -pedantic 4.01 не было, что я включил, чтобы получить предупреждение? – zoul
Использование g ++ 4.3.2 здесь, на Debian, параметры не имеют значения, достаточно просто вызвать «g ++ test.cpp», добавив -Wall, -pedantic или оба ничего не изменили. Кажется, это предупреждение было добавлено где-то после 4.1/4.2. – schnaader