为什么会说“内存访问违规”?
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;
}
答案 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;
}