Почему этот код показывает ошибку сегментации на codechef?

Пожалуйста, я застрял в этом вопросе на полчаса и не могу найти причину ошибки?
Код проблемы: тест
Жизнь, вселенная и все

#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);
}

1

Решение

Ваш код пытается получить доступ к несуществующим элементам массива, что вызывает segfault. Вам следует остановить цикл до того, как индекс массива станет больше длины массива минус 1:

int a[20];

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

Другие решения

Помимо проблем с лимитом, ваши элементы печати без их инициализации

//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";
}
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.

0

  • Вы используете значения массива перед их инициализацией. C ++ не инициализирует нестатические массивы для вас, если вы не сообщите об этом, поэтому $ DEITY знает, что там. И технически, что бы там ни было, может вызвать исключение … или любое количество других вещей. (Для ints, на машине 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;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector