1

请我在这个问题上停留了半个小时,找不到错误出现的原因?问题代码:测试生命、宇宙和一切

#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

4 回答 4

4

您的代码尝试访问不存在的数组元素,这会导致段错误。您应该在数组索引大于数组长度减 1 之前停止循环:

int a[20];

for (i = 1; i < 20 && a[i - 1] != 42; i++)
{
  // ...
}
于 2013-08-21T16:07:23.237 回答
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。

于 2013-08-21T16:56:34.187 回答
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;
}
于 2013-08-21T16:56:51.707 回答
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";
}
于 2013-08-21T16:15:18.980 回答