无法修改char * - 内存访问冲突

时间:2011-03-17 18:45:00

标签: c++ arrays pointers char

为什么会说“内存访问违规”?

  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;
  }

4 个答案:

答案 0 :(得分:22)

字符串文字存储在内存的只读部分中。任何修改字符串文字内容的尝试都会调用Undefined Behavior(大多数实现中的分段错误)。

使用字符数组

char str[] = "HelloGuys";

答案 1 :(得分:1)

正如Prasoon已经说过的,字符串文字是不可修改的。

如果你需要一个可修改的字符数组,可以这样:

char str[] = "HelloGuys";

答案 2 :(得分:1)

如果程序尝试修改字符串文字的任何部分(大多数编译器选择引发“内存访问冲突”错误),则该行为是不确定的。最重要的是要确定何时尝试修改字符串文字,何时不进行修改。

没关系:

 char str[]  = "string literal";
 str[0] = 'S';

您已复制了字符串文字。您不是在修改字符串文字,而是在数组str。

这不行:

 char *str  = "string literal";
 str[0] = 'S';

您从未复制过字符串;指针指向字符串文字本身。 您正在尝试修改字符串文字。

答案 3 :(得分:0)

要解决此问题,请使用数组而不是指向只读内存的指针:

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;
}