2016-08-29 6 views
0

1つの配列を非常に単純なforループに入れ、2つの配列を入れたときに出力が異なる理由を理解できません。私が欲しいものである、0,1,2,3,4,5,6 ...、100、しかし それはようarrN出力:C++ forループは、複数の配列より1つの配列で異なる結果を出力します。

int arrR[100]; 
int arrN[100]; 

//function to run the simulation 
void runsim(){ 
    for(int i=1;i<=100;i++){ 
     arrN[i] = i; 
     arrR[i] = i; 
    } 
} 


//function to print the array 
void printarr(int x[100]){ 
    for(int i=0;i <= 100;i++){ 
     cout << x[i] << ", "; 
    } 
cout << endl; 
} 


int main(){ 
runsim(); 
printarr(arrR); 
printarr(arrN); 

return 0; 
} 

これはとしてarrRを出力し100,1,2、私が理解していない3,4,5,6、...、100。

私はこれは0,1,2,3,4,5,6、...、100

としてarrN出力

int arrR[100]; 
int arrN[100]; 

//function to run the simulation 
void runsim(){ 
    for(int i=1;i<=100;i++){ 
     arrN[i] = i; 
    } 
} 


//function to print the array 
void printarr(int x[100]){ 
    for(int i=0;i <= 100;i++){ 
     cout << x[i] << ", "; 
    } 
cout << endl; 
} 


int main(){ 
runsim(); 
printarr(arrN); 

return 0; 
} 

をしたいどのようにループarrNプリント用からarrRを削除した場合

興味深いことに、コード内の100から100までをすべて変更すると、両方の配列をforループに入れてもこの問題は解消されます。

誰かが私が行方不明を理解するのを助けることができますか?私はC++を初めて使ったのでシンプルだと確信しています。ありがとうございました!

+4

for(int i = 1; i <= 100; i ++) '...問題は既にあります:配列はC++でゼロベースです。アクセスできないメモリ領域にアクセスしようとしています。 –

+0

アクセスするための 'x [100]'はありません –

答えて

4

forの条件がi<=100であることを確認します。等号は、arrN[100]で配列にアクセスし、その後、境界から外れることを意味します。これはundefined behaviorです。何でも可能です。有効な範囲は[0, N)N = 100)、つまりarrN[0]、...、arrN[N - 1](つまりarrN[99])である必要があります。

すべての条件をi < 100に変更したい場合があります。

+0

うわーありがとう!私はそれが何か単純なものになることを知っていた。 – Jimmy

2

1の代わりに0から始まる配列インデックスは、nの代わりにn-1で終了することに注意してください。今すぐあなたの関数runsim()には、割り当て値100arrN[100]arrR[100]にアクセスしていますが、これはundefined behaviorになります。

あなたはバウンド要素をアクセスするだけでなく、エラーを生成しませんのでご注意くださいループ条件

for(int i = 0; i < 100; i++) { 
// Do something. 
} 

のために変更する必要があります。詳細については、Accessing an array out of bounds gives no error

関連する問題