c ++ segfault:char指针

时间:2012-06-06 17:49:32

标签: c++ c pointers char segmentation-fault

  

可能重复:
  How do you reverse a string in place in C or C++?
  Why is this C code causing a segmentation fault?
  Modifying value of char pointer in c produces segfault

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

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

我一直都是

 Segmentation fault

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

P.S。我用

编译
g++ example.c

2 个答案:

答案 0 :(得分:5)

两个问题:

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

答案 1 :(得分:2)

您正在修改字符串文字,字符串文字是不可修改的。

使用char s[] = "letters\n";代替