【问题标题】:Why is my C++ code giving segmentation fault(core dumped)? [closed]为什么我的 C++ 代码会出现分段错误(核心转储)? [关闭]
【发布时间】:2021-03-09 00:42:52
【问题描述】:

在我的程序编译时出现分段错误(核心转储)。我无法检测到程序的问题。我正在粘贴我的代码。如果有人遇到问题,请回复。

#include<bits/stdc++.h>
using namespace std;
typedef long double ld;

int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    ld dp[101][101][101];
    for(int i=100;i>=0;i--)
    {
        for(int j=100;j>=0;j--)
        {
            for(int k=100;k>=0;k--)
            {
                if(i==100 || j==100 || k==100)
                {
                    dp[i][j][k] = 0;
                }
                else
                {
                    long double cnt = i+j+k;
                    dp[i][j][k] = 1 + (1.0*i/cnt)*dp[i+1][j][k] + (1.0*j/cnt)*dp[i][j+1][k] + (1.0*k/cnt)*dp[i][j][k+1];
                }
            }
        }
    }  
    cout<<dp[a][b][c];
    return 0;
}

【问题讨论】:

  • 1.0*i/cnt i = j = k = 0 时最后一次迭代会发生什么?
  • 也看看为什么不Declare large array on Stack
  • 两个建议:1) 请在调试器中运行您的应用程序,获取堆栈回溯:xspdf.com/resolution/51890324.html 这是关键。请使用回溯更新您的帖子。 2)考虑将ld dp[101][101][101];改为newmalloc()(动态分配)。我怀疑“崩溃”可能只是stack overflow
  • “我的程序在编译时出现分段错误(核心转储)。” -- 值得怀疑。您更有可能正在执行某种“构建和运行”操作,并且您在运行程序时遇到了崩溃。发送到std::cerr 的调试器或诊断消息应该使您能够找到触发崩溃的行。由此,请构建一个关注问题的minimal reproducible example。 (如果崩溃似乎发生在任何行运行之前,请尝试修剪 main 中的所有内容,但 dp 的定义。)
  • 有人给出了一个答案,指出了一个特定的原因,而您编辑了这个问题,使他们的答案不再有效。因此,显然,您的意图是在每次获得答案时继续编辑您的代码,直到它被完全调试。使用 SO 作为一种以这种方式迭代调试代码的方法,至少会惹恼一些人。

标签: c++ algorithm dynamic-programming


【解决方案1】:

编译错误和分段错误是完全不同的事情。当编译器出错时,您根本无法运行代码。运行代码后发生 Seg-fault。

程序可能崩溃的地方很少:

  1. i = j = k = 0 时,cnt 的值也为 0。尝试除以 0,1.0 * i / cnt 会导致崩溃。

  2. 如果用户输入a,b,c 中的任何值作为负数或大于100,则最终的cout 语句将导致数组越界,并且再次成为崩溃的良好候选者。

【讨论】:

  • 我已经编辑了代码,但仍然出现分段错误。它没有接受输入,所以第二点不是原因。
  • @iammilind - 你已经给出了很好的回应......但也许 OP 可以做的最重要的事情是在调试器中运行他的应用程序,并获得可行的堆栈跟踪。在那之前,我们真的不知道为什么会发生崩溃。
猜你喜欢
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2015-11-24
  • 1970-01-01
相关资源
最近更新 更多