可能重复:
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
答案 0 :(得分:5)
两个问题:
char s[] = "letters\n"
制作可变副本。last_char()
实际上返回指向字符串末尾的标记'\0'
的指针 - 它指向最后一个字符之外。将return last
更改为return last - 1
。否则你也会移动哨兵,这几乎肯定不是你想要的。 (注意,如果字符串为零长度,这将返回指向垃圾的指针。如果in_place_reverse()
,您应该在*s == '\0'
中快速成功,以避免这种复杂性。)答案 1 :(得分:2)
您正在修改字符串文字,字符串文字是不可修改的。
使用char s[] = "letters\n";
代替