Почему я не могу редактировать символ в символе *? - PullRequest
6 голосов
/ 20 сентября 2011

Ниже приведен чрезвычайно простой пример.Он прекрасно компилируется с помощью gcc на Mac OS X (Snow Leopard).Во время выполнения выдает ошибку шины: 10. Что здесь происходит?

char* a = "abc";
a[0] = 'c';

Ответы [ 5 ]

7 голосов
/ 20 сентября 2011

Ваш код устанавливает a на указатель на "abc", который является буквальными данными, которые нельзя изменить.Ошибка шины возникает, когда ваш код нарушает это ограничение и пытается изменить значение.

Попробуйте вместо этого:

char a[] = "abc";
a[0] = 'c';

Это создает массив символов (в обычном пространстве данных вашей программы)и копирует содержимое строкового литерала в ваш массив. Теперь у вас не должно быть проблем с внесением изменений в него.

3 голосов
/ 20 сентября 2011

Это

char* a = "abc";

полагается на опасное неявное преобразование из const char[] (тип строкового литерала) в char*. (В C ++ это преобразование считается устаревшим уже более десяти лет. Однако я не знаю, как работает C).

Строковый литерал не должен быть изменен.

3 голосов
/ 20 сентября 2011

Вы пытаетесь изменить строковую константу. Используйте это вместо:

char a[] = "abc";
a[0] = 'c';
1 голос
/ 20 сентября 2011

char * str = "string"; В таком случае он рассматривается как литерал только для чтения. Это похоже на написание 'const char * str = "string"'. То есть значение, на которое указывает указатель 'str', является константой. Попытка изменить приведет к ошибке шины.

1 голос
/ 20 сентября 2011

char * a = "abc";константная строка, хранящаяся в разделе .data двоичного файла ELFВам не разрешено изменять эту память, и если в некоторых случаях вы будете подвергаться неопределенному поведению, это не даст никакой ошибки, но не изменит память в вашем случае, если вы получите ошибку шины, потому что вы пытаетесь получить доступ к памяти, которую вы обычно не можете (длянаписание)

...