【问题标题】:Segmentation Fault in a simple program简单程序中的分段错误
【发布时间】:2015-09-18 18:40:52
【问题描述】:

我必须向提供反馈的裁判系统提交一些 c++ 代码。

但是,我遇到了“硬测试用例”的段错误。

如果有人可以快速查看我的代码来帮助我,那就太好了。

(第一个输入总是一个正整数)

#include <iostream>
using namespace std;

int main()
{
    long long t;
    cin >> t;
    bool table[t][t];
    long long n = t;
    int sum = 0;
    long long s;
    while(t--)
    {
        cin >> table[t][t];
        if (!table[t][t])
        {
            sum++;
        }
    }
    for(t=0;t<n;t++)
    {
        for(s=t+1;s<n;s++)
        {
            table[t][s] = 
                    (table[t][s-1] && !table[s][s]) ||
                    (!table[t][s-1] && table[s][s]);
            if(!table[t][s])
            {
                    sum++;
            }
        }
    }
    cout << sum << endl;
    return 0;
}

【问题讨论】:

  • bool table[t][t]; 不是有效的 C++,因为 t 的值在编译时是未知的。您的编译器没有将其报告为错误吗?
  • 启动调试器并检查实际出了什么问题,应该比在这里询问更好的线索!
  • no. should i rather use malloc 如果您使用 c 编程,是的,如果您使用的是 c++,则不是。 c++ 的答案是使用 std::vector。
  • long long t; 我怀疑允许值比你的堆栈大得多。
  • it also segfault's when i'm using int.. 那还是太大了。请记住堆栈大小为几 MB。不是 GB。

标签: c++ segmentation-fault dynamic-programming


【解决方案1】:

我没有看到任何可能的索引会超出范围,所以很可能“困难情况”有t 大到足以溢出堆栈,因为您使用非标准 C++ 动态数组。使用std::vector在堆上为您的数组分配数据

vector<vector<bool>> table{ t, vector<bool>{ t } };

vector<vector<bool>> table( t, vector<bool>( t ) ); // if you do not have C++11 yet

【讨论】:

    【解决方案2】:

    如果我输入t= 2,您使用std::cin 读取的值将是table[2][2],这是无效索引,因此会引发分段错误。 t=2 的最大索引为 table[1][1]

    【讨论】:

    • 不正确,t 在循环中使用,它被递减
    • 这是递减后,而不是递减前。 @Slava
    • 在那种对索引无关紧要的上下文中(对循环逻辑很重要)。想想这段代码:int a = b++; int c = b; 如果你将b++ 更改为++b,那只会影响a 而不会影响c
    • 我的错误。道歉。
    • 不用道歉,每个人都会犯错:)
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多