Как разрешить ошибку определения места нарушения прав доступа?
У меня есть простая программа, и я получаю нарушение доступа в *(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
Это потому, что вы пишете в хранилище строковых литералов, которое может находиться в защищенной области памяти.