【问题标题】:Program received signal SIGSEGV, Segmentation fault while debugging in codeblocks程序收到信号 SIGSEGV,在代码块中调试时出现分段错误
【发布时间】:2019-07-04 17:08:09
【问题描述】:

我是 C++ 的初学者,我正在尝试解决 https://projecteuler.net/problem=9 。我为它写了一个代码,它显示了错误——程序收到信号 SIGSEGV,分段错误。 在strcmp() (C:\Windows\syswow64\msvcrt.dll) 调试时。

如果我直接运行程序,会出现一个对话框,上面写着“windows 正在检查解决方案。”

我试过不使用字符串函数,而不是写 pytha(a,b,c)=="true" ,我只是写了 axa+bxb=c*c (我写 * 而不是 x 但在这里没有在两个 a 之间显示 * 所以我用 x 替换它)并且代码工作得很好。但问题是为什么它不适用于字符串函数?

我看不出代码有什么问题。

我发现了很多类似的问题- 1.https://www.codeproject.com/Questions/93770/what-is-this-means-Program-received-signal-SIGSEGV
根据这个,我的程序指的是它无权访问的内存位置。但我没有看到任何限制此代码访问某些内容的东西。

  1. Program received signal SIGSEGV, Segmentation fault error

3.Debug---Program received signal SIGSEGV, Segmentation fault

  1. program received signal SIGSEGV, segmentation fault

  2. "Program received signal SIGSEGV, Segmentation fault."

  3. Program received signal SIGSEGV, Segmentation fault

  4. Program received signal SIGSEGV, segmentation fault, Linked list program

他们都没有回答我的问题,因为我无法将其中提到的代码与我的代码联系起来。 编号为 5 的链接提到该错误可能是由于涉及大量计算。即使我对我的代码也有疑问,但是当我不使用函数“pytha”时它可以正常工作。另外,我没有看到与内存访问相关的错误涉及的大量步骤。

此外,即使涉及大量步骤是原因,程序也应该在给定足够的时间时编译。但事实并非如此。它直接显示“Windows 正在寻找解决方案”的错误。

#include <cmath>
#include <iostream>
#include <string>

using namespace std;

string pytha(int a, int b, int c) {
    if(a * a + b * b == c * c) return "true";
}

int main() {
    for(int a = 1; a < 1000; a++) {
        for(int b = 1; b < 1000; b++) {
            for(int c = 1; c < 1000; c++) {
                if(a + b + c == 1000) {
                    if(pytha(a, b, c) == "true")
                        cout << "a= " << a << " b= " << b << " c= " << c;
                }
            }
        }
    }
}

请注意,此代码效率非常低。关键不是要解决问题,而是要知道程序为什么无法编译。

【问题讨论】:

  • 除了段错误,我能问一下为什么你使用字符串作为返回类型,而不是像 bool 这样的类型吗?您还应该真正启用编译器警告以捕获此类错误。
  • 如果条件不成立,您的函数不会返回任何内容,这是未定义的行为。

标签: c++


【解决方案1】:

pytha 不会在其所有控制流路径上返回值。

修复:

string pytha(int a, int b, int c)
{
    if (a*a+b*b==c*c)
        return "true";
    return "";
}

始终在启用警告的情况下编译您的代码。对于gccclang,编译器命令行选项是-Wall -Wextra -Werror


您可能想使用bool 类型而不是string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多