c++ - 程序收到信号 SIGSEGV,分段错误。C++
问题描述
我在调试期间遇到此错误(*s = *end; line),同时尝试使用指针反转字符串。我正在使用 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));
.
推荐阅读
- excel - 如何在访问数据库中使用左连接从excel表中进行选择-EXCEL VBA
- javascript - 显示有关 JSON 用户的信息
- apache-kafka - 除了 Kafka 中的“重试”之外,影响属性的消息顺序
- javascript - 我正在尝试在 URL 上使用 JSContext evaluateScript 运行 javascript
- java - 由于 LiveData 的索引 0 无效,Custome ArrayAdapter 崩溃
- google-apps-script - 使用 Google Appscript - 如何使用位于 Gmail 中的草稿模板中的自定义正文发送自动电子邮件?
- c++ - 为什么 _GLIBCXX_DEBUG 必须在第一行设置?
- python - 如何从与我尝试导入的文件处于同一级别的目录中导入变量、函数等?
- nativescript - 可以进行本地云构建吗?
- python - 如何使用正则表达式从两个相似的 html 类元素中提取数据?