невозможно изменить символ * - нарушение доступа к памяти - PullRequest
6 голосов
/ 17 марта 2011

Почему написано "Нарушение доступа к памяти"?

  char* str = "HelloGuys";
  int len = strlen(str);
  for (int i=0; i<(len/2); ++i){
        char t = str[len-i-1];
        str[len-i-1] = str[i]; //error
        str[i] = t;
  }

Ответы [ 3 ]

22 голосов
/ 17 марта 2011

Строковые литералы хранятся в разделе памяти, доступном только для чтения.Любая попытка изменить содержимое строкового литерала вызывает Undefined Behavior (ошибка сегментации в большинстве реализаций).

Используйте массив символов вместо

char str[] = "HelloGuys";
1 голос
/ 17 марта 2011

Как уже сказал Прасун, строковые литералы не могут быть изменены.

Если вам нужен модифицируемый массив символов, сделайте так:

char str[] = "HelloGuys";
0 голосов
/ 17 марта 2011

Чтобы исправить это, используйте массив вместо указателя на постоянную память:

char str[] = "HelloGuys";   // change this line
int len = strlen(str);
for (int i=0; i<(len/2); ++i){
    char t = str[len-i-1];
    str[len-i-1] = str[i];
    str[i] = t;
}
...