user2696751
user2696751

Reputation: 29

Why is this code showing segmentation error on codechef?

Please i am stuck at this question for half an hour and can't find why the error comes? Problem code : test Life, Universe and Everything

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

Upvotes: 1

Views: 127

Answers (4)

cHao
cHao

Reputation: 86525

  • You use array values before initializing them. C++ doesn't initialize non-static arrays for you unless you tell it to, so $DEITY knows what's in there. And technically, whatever's in there could cause an exception...or any number of other things. (For ints, on an x86 machine, that's actually highly unlikely. But elsewhere, it's possible.)

  • The user can enter more than 20 numbers. That's really just a special case of the more general problem, though: You allow unknown number of entries, but aren't able to accept them all without crashing.

If you don't know beforehand how many objects there will be, use a vector.

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

Upvotes: 0

iampranabroy
iampranabroy

Reputation: 1796

You are trying to print the uninitialized data...

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

In the for loop get the data first and then print it.Your array size is 20 but you are trying to write upto 42.

Upvotes: 0

kol
kol

Reputation: 28698

Your code tries to access non-existing array elements, which causes segfault. You should stop your loop before the array index gets larger than the length of the array minus 1:

int a[20];

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

Upvotes: 4

mohit
mohit

Reputation: 6054

Apart from limit problem, your printing elements without initializing them

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

On accessing a local variable (like this), you're likely to get garbage value.

This might be better substitute for what you are trying to do:

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

Upvotes: 0

Related Questions