2013-08-21 2 views
1

30 분 동안이 질문에 갇혀 있고 왜 오류가 발생하는지 찾을 수 없습니까? 문제 코드 : 시험 생명, 우주와 모든이 코드가 코덱에 세그먼트 오류를 ​​표시하는 이유는 무엇입니까?

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

Ermm ... 'i> 19' 전에 루프가 종료되고'a [i] '에 대한 액세스가 segfault가 될 수 있습니다. – arne

+0

배열의 크기를 늘려야한다는 것을 의미합니까? – user2696751

+0

@ Nbr44, 숫자가 42가 될 때까지 42 개의 요소가 아님. 아직도 ... – chris

답변

4

코드는 segfault의 원인이되는 존재하지 않는 배열 요소에 액세스하려고합니다. 제한 문제에서 별도로

int a[20]; 

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

지역 변수에 액세스하는 그들

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

를 초기화하지 않고, 당신의 인쇄 요소 : 배열 인덱스 1을 뺀 배열의 길이보다 큰지기 전에 당신은 당신의 루프를 중지해야 (이와 같이) 쓰레기 값을 얻게 될 것입니다. 먼저 데이터를 얻을 루프 ...

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

을 :

이것은 당신이 무엇을하려고 더 나은 대체 할 수 배열 크기는 20이지만 최대 42 자까지 쓰려고합니다.

0
  • 배열 val 그것들을 초기화하기 전에. C++은 말하지 않는 한 비 정적 배열을 초기화하지 않으므로 $ DEITY는 그 안에 들어있는 내용을 알고 있습니다. 그리고 기술적으로, 거기에있는 것이 무엇이든 예외를 유발할 수 있습니다. x86 시스템에서 int의 경우 실제로는 그렇지 않지만 다른 곳에서는 가능합니다.

  • 사용자가 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; 
} 
관련 문제