程序接收到信号SIGSEGV,分段故障.C++



我在调试过程中遇到了这个错误(*s=*end;行(,同时尝试使用指针反转字符串。我使用的是Windows 10操作系统、代码块IDE和GDB调试器。

#include <stdio.h>
#include <string.h>
#include <limits.h>
void myreverse(char* s);
int main()
{
char* s1 = "1234";
myreverse(s1);
printf("%s", s1);
return 0;
}
void myreverse(char* s) {
char tmp;
char* end = s + strlen(s) - 1;
for(; s < end; s++, end--) {
tmp = *s;
*s = *end;
*end = tmp;
}
}

您应该将s1更改为char s1[] = "1234";,因为您正在对字符串进行更改。

然后在myreverse()函数中,您永远不会使用tmp变量,这会导致交换块失败。

固定:

#include <cstdio>   // use the C++ versions of the header files
#include <cstring>
void myreverse(char* s) {
char tmp;
char* end = s + std::strlen(s) - 1;
for(; s < end; s++, end--) {
// swap
tmp = *s;
*s = *end;
*end = tmp;   // use tmp
}
}
int main() {
char s1[] = "1234";
myreverse(s1);
printf("%s", s1);
}

注意,交换块中的3条线可以用std::swap(*s, *end);替换,并且myreverse()可以完全用std::reverse(std::begin(s1), std::end(s1));替换。

最新更新