Как решить ошибку записи о нарушении прав доступа?

У меня есть простая программа, и я получаю нарушение прав доступа по адресу *(str + start). Почему? Я должен быть в состоянии изменить это. Верно?

void fn()
{
     char *str = "Hello wordl!";
     int end = strlen(str);
     int start = 0;
     end--;
     while(start < end)
     {
         *(str + start) = *(str + end);  <--- Access violation writing location *(str + Start).
         end--;
         start++;
     }
}

person Community    schedule 16.03.2009    source источник


Ответы (5)


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

Замена объявления на char str[] = "Hello World"; должна делать то, что вы хотите, помещая строку в изменяемый массив в стеке.

person Michael    schedule 16.03.2009
comment
char str[] по сравнению с char* str приводит к изменению строки. - person Michael; 17.03.2009
comment
Вот пара ссылок на это: iso-9899.info/wiki/StringsByExample securecoding.cert .org/confluence/display/cplusplus/ - person Michael; 17.03.2009

Нет, не следует. «Hello world» — это постоянный строковый литерал, вам нужно выделить память с помощью malloc() в C или new в C++, если вам нужна память. бесплатно модифицировать.

person MattJ    schedule 16.03.2009

Как указывали другие, литеральные строки могут храниться в области памяти, доступной только для чтения. Вы компилируете с включенными предупреждениями? Вы должны получить предупреждение об отбрасывании константности строкового литерала.

Что вы можете сделать вместо этого:

char *str = strdup("Hello, world!");
// Modify the string however you want
free(str);
person Isvara    schedule 17.03.2009

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

person Daniel Earwicker    schedule 16.03.2009

В вашем примере Hello wordl! является постоянной строкой, любая попытка изменить эту постоянную строку приведет к исключению. Вместо этого вы можете сделать это -

string s = "Hello wordl!";
char* ptr = &s[0];

а затем поиграйте с ptr.

person A. Gupta    schedule 21.08.2018