c++ segfault: char pointers

c++ segfault: char pointers

本文关键字:pointers char segfault c++      更新时间:2023-10-16

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

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

#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 = "lettersn";
  std::cout << in_place_reverse(s);
}

我一直得到

 Segmentation fault

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

附言我编译

g++ example.c

两个问题:

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

您正在修改字符串文本,并且字符串文本不可修改。

请改用char s[] = "lettersn";