【问题标题】:Program received signal SIGSEGV, Segmentation fault. C++程序收到信号 SIGSEGV,分段错误。 C++
【发布时间】:2020-04-19 06:46:34
【问题描述】:

我在调试期间遇到此错误(*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;
    }
}

【问题讨论】:

  • char* s1 = "1234"; 应该是 const char* s1 = "1234";char s1[] = "1234"; 如果你想改变它。
  • ^^^^ 这会破坏你的构建,而不是像你现在那样调用 undefined behavior 。不要感到惊讶,这就是您在这种情况下想要的,因为它指出了真正的问题。然后,将const char *s1 = "1234"; 更改为char s1[] = "1234";,然后再翻一遍。
  • 看起来*end = *s; 应该是*end = tmp;

标签: c++ segmentation-fault codeblocks


【解决方案1】:

您应该将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));

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多