нужна помощь в изменении одного символа в символе * - PullRequest
3 голосов
/ 17 июня 2011

Я возвращаюсь в c ++ и имею представление о указателях и тому подобное, однако я надеялся, что смогу получить некоторую помощь в понимании того, почему этот сегмент кода выдает ошибку шины.

char * str1 = "Hello World";
*str1 = '5';

ОШИБКА:Ошибка шины: (

И вообще, мне интересно, как изменить значение одного символа в cstring. Поскольку я понимаю, что * str = '5' должно изменить значение, на которое указывает str, сОт «H» до «5». Поэтому, если бы я должен был распечатать str, он бы выглядел: «5ello World».

В попытке понять, я также написал этот фрагмент кода, который работает, как и ожидалось;

char test2[] = "Hello World";
char *testpa2 = &test2[0];
*testpa2 = '5';

Это дает желаемый результат. Так в чем же разница между testpa2 и str1? Разве они оба не указывают на начало серии символов с нулевым символом в конце?

Ответы [ 3 ]

6 голосов
/ 17 июня 2011

Когда вы говорите char *str = "Hello World";, вы делаете указатель на литеральную строку, которая не подлежит изменению.Необходимо вместо этого присвоить литерал const char*, но по историческим причинам это не так (упс).

Когда вы говорите char str[] = "Hello World;", вы создаете массив, который инициализируется в (и по размеру) строка, известная во время компиляции.Это нормально для изменения.

4 голосов
/ 17 июня 2011

Не все так просто. : -)

Первый создает указатель на данный строковый литерал, который разрешается помещать в постоянную память.

Второй создает массив (обычно в стеке и, таким образом, для чтения-записи), который инициализируется содержимым данного строкового литерала.

3 голосов
/ 17 июня 2011

В первом примере вы пытаетесь изменить строковый литерал, что приводит к неопределенному поведению.

Согласно стандарту языка в 2.13.4.2

Все ли строковые литералы различны (то есть, хранятся в неперекрывающихся объектах), определяется реализацией. Эффект попытки изменить строковый литерал не определен .

Во втором примере вы использовали инициализацию строкового литерала, определенную в 8.5.2.1

Массив char (будь то обычный char, знаковый char или unsigned char) может быть инициализирован строковым литералом (необязательно заключенным в фигурные скобки);массив wchar_t может быть инициализирован широким строковым литералом (необязательно заключенным в фигурные скобки);последовательные символы строкового литерала инициализируют члены массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...