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

У меня есть простая программа, и я получаю нарушение доступа в *(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++;
     }
}

Ответ 1

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

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

Ответ 2

Нет, не стоит. "Hello world" - это постоянный строковый литерал, вам нужно выделить память с помощью malloc() в C или new в С++, если вы хотите изменить память, которую вы можете изменить.

Ответ 3

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

Вместо этого вы можете:

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

Ответ 4

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