c ++ segfault:char指针

mea*_*dre -1 c c++ pointers char segmentation-fault

可能重复:
如何在C或C++中反转字符串?
为什么这个C代码会导致分段错误?
在c中修改char指针的值会产生段错误

运行一个非常简单的代码示例

#include <stdlib.h>
#include <iostream>

char* last_char(char* s){
  char* last = s;
  while (*last) ++last;
  return last;
}

char* in_place_reverse(char* s) {
  char* left = s;
  char* right = last_char(s);
  char temp;

  while( left < right ) {
    temp = *left;
    *left = *right;
    *right = temp;

    left++;
    right--;
  }

  return s;
}

int main(){
  char * s = "letters\n";
  std::cout << in_place_reverse(s);
}
Run Code Online (Sandbox Code Playgroud)

我一直都有

 Segmentation fault
Run Code Online (Sandbox Code Playgroud)

但是从我的角度来看,我在代码中没有做任何违法的事情.请帮我确定是什么问题.

PS我编译

g++ example.c
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 5

两个问题:

  1. 您正在尝试修改字符串文字.这可能有用,可能没有,或者可能会崩溃.这是在调用未定义的行为.使用char s[] = "letters\n"使一个可变的副本.
  2. last_char()实际上返回一个指向'\0'字符串末尾的标记的指针- 它指向最后一个字符之外.更改return lastreturn last - 1.否则你也会移动哨兵,这几乎肯定不是你想要的.(注意,如果字符串是零长度,这将返回指向垃圾的指针.in_place_reverse()如果*s == '\0'要避免这种复杂性,你应该快速成功.)