为什么此代码在codechef上显示分段错误?

时间:2013-08-21 16:00:41

标签: c++

请问我在这个问题上被困了半个小时,但是找不到错误的原因? 问题代码:测试 生命,宇宙和一切

#include<iostream>

using namespace std;

int main()
{
    int a[20],i;
    cin>>a[0];

    for(i=1;a[i-1]!=42;i++)
    {
        cout<<a[i]<<"\n";
        cin>>a[i];
    }

    return(0);
}

4 个答案:

答案 0 :(得分:4)

您的代码尝试访问不存在的数组元素,这会导致segfault。你应该在数组索引大于数组长度减1:

之前停止循环
int a[20];

for (i = 1; i < 20 && a[i - 1] != 42; i++)
{
  // ...
}

答案 1 :(得分:0)

除了限制问题,您的打印元素没有初始化

//for i = 1, a[i] is uninitialized
cout<<a[i]<<"\n"; 

在访问本地变量(如此)时,您可能会获得垃圾值。

这可能更好地替代您要做的事情:

int a[20],i;
for(i=0;i < 20;i++)
{
    cin>>a[i];
    if (a[i] == 42)
        break;
    cout<<a[i]<<"\n";
}

答案 2 :(得分:0)

您正在尝试打印未初始化的数据......

#include<iostream>
using namespace std;
int main()
{
int a[20],i;
cin>>a[0]; // a[0] uninitialized
for(i=1;a[i-1]!=42;i++)
    {
    cout<<a[i]<<"\n";
    cin>>a[i];
    }
return(0);
}

在for循环中首先获取数据然后打印它。您的数组大小为20但是您尝试写入最多42个。

答案 3 :(得分:0)

  • 在初始化之前使用数组值。除非你告诉它,否则C ++不会为你初始化非静态数组,所以$ DEITY知道那里有什么。从技术上讲,无论在那里有什么可能导致例外......或任何其他事情。 (对于整数,在x86机器上,这实际上是不太可能。但在其他地方,这是可能的。)

  • 用户可以输入20个以上的号码。然而,这只是一个更普遍的问题的特例:您允许未知数量的条目,但不能在不崩溃的情况下接受它们。

如果您事先不知道有多少个物体,请使用矢量。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    std::vector<int> a;
    int entry;
    cin>>entry;

    // Oh, yeah.  This.  You really, *really* want to check `cin`.
    // Otherwise, if the user decided to type "i like cheese", you'd loop
    // forever getting zeros while cin tried to parse a number.
    // With the array, that'd typically cause a segfault near instantly.
    // With a vector, it'll just eat up all your CPU and memory.  :P
    while (cin && entry != 42) {
        a.push_back(entry);
        cout << entry << "\n";
        cin >> entry;
    }

    return 0;
}