ошибка прерывания во время выполнения с указателем на массив символов - PullRequest
1 голос
/ 16 августа 2011

C ++ - Эта программа выдает ошибку прерывания во время выполнения в строке 2.

char * ptr = "hello";
(*ptr)++;            // should increment 'h' to 'i'
cout<<ptr<<endl;     // should display 'iello' 

Необработанное исключение в 0x004114b0 в test.exe: 0xC0000005: Место записи нарушения прав доступа 0x00417830.

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

char arr[] = "hello";
char * ptr = arr;
(*ptr)++;           // increments 'h' to 'i'
cout<<ptr<<endl;    // displays 'iello'

Ответы [ 2 ]

3 голосов
/ 16 августа 2011

Потому что вы пытаетесь изменить постоянную память. Существует C FAQ , который является адекватным, даже если это вопрос C ++.

В основном, когда вы говорите char *ptr = "hello", компилятор может поместить "привет" только для чтения. память, поэтому пытаться писать в нее небезопасно.

Другой C FAQ может быть полезным:

В чем разница между этими инициализациями?

char a[] = "string literal";
char *p  = "string literal";
0 голосов
/ 16 августа 2011

Когда вы объявляете char * ptr = "hello"; это означает, что ptr указывает на постоянную строку

когда вы говорите ptr ++, Вы пытаетесь изменить базовый адрес, который не является правильным

...