【问题标题】:SIGSEGV in a simple programSIGSEGV 在一个简单的程序中
【发布时间】:2015-12-08 22:03:40
【问题描述】:

我有这个代码

typedef long long int ll;
#define MOD 1000000007
ll t,n,total,answer[2][1025];
int arr[100001];
cin>>n;
for(int i=0;i<n;i++)
cin>>arr[i];
memset(answer,0,sizeof(answer));
memset(arr,0,sizeof(arr[0]*n));
for(int i=1; i<n; i++)
{
    for(int j=0; j<=1024; j++)
    {
        int index1=(i-1)%2;
        int index2=j^arr[i];
        ll pre1=answer[index1][j]%MOD;
        ll pre2=answer[index1][index2]%MOD;
        answer[(i%2)][j]=(pre1+pre2)%MOD;
    }
}

我不知道为什么这段代码给出了 RE(SIGSEGV)。有人可以帮忙吗?

【问题讨论】:

  • 你在哪里给n赋值? MOD 的值是多少? ll 是什么?除此之外:该程序的存在权是什么(除了崩溃......)?
  • 好的,你编辑了它,使 cmets/answers 无效:( 接下来 - 你在调试器下运行它时发现了什么?哪一行产生了错误,相关的 var 值是什么?跨度>
  • 我投票决定将此问题作为题外话结束,因为持续编辑更改源代码的速度比阅读速度快。
  • @MartinJames 这不是结束问题的理由。海报应该在其书写方式存在问题时澄清问题。
  • 注意sizeof(arr[0]*n) 中的错误) 如果您真的打算用零覆盖所有输入,那么您失败了。但是,如果您打算用零覆盖所有内容,输入是什么?

标签: c++ runtime-error segmentation-fault


【解决方案1】:

您需要检查n 的有效性,否则用户可能会立即使您的程序崩溃。一旦n(以及i)越界,您将处理不属于您的程序的内存。

【讨论】:

  • 除非他输入的内容高于100000,否则不会导致错误。
  • @vishwaskumar:你不会在任何地方强制执行
  • @Barmar 这就是我所说的validityable to的意思。 Vishwas 允许用户输入无效值,直到现在他还没有告诉我们他在运行程序时给n 哪个值
  • @anybody 这就是为什么我问他在评论中输入了什么,然后发布一个假设他输入无效的答案。
  • @Barmar 不假设n 的错误值会导致问题。除此之外:新用户不能发表评论,我相信你知道。
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2016-08-28
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多