-1

可能重复:
如何在 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);
}

我一直得到

 Segmentation fault

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

PS我编译

g++ example.c
4

2 回答 2

5

两个问题:

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

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

char s[] = "letters\n";改为使用

于 2012-06-06T17:50:20.640 回答