2016-12-18 5 views
-2

なぜこのコードはうまく機能せず、解決策は何ですか?C言語での配列への割り当て

以下の関数では、その関数によって生成されたすべての値を配列に割り当てようとしています。int oというループのやや簡単な形式を作成しています。 (配列の先頭からの割り当てを開始するため、上記のループは使用できません)

プログラムがクラッシュします。

#include <stdio.h> 
#include <stdlib.h> 


int main() 
{ 

int i; 
int s; 
int o; 
int n; 
n=20; 
long int arr[n]; 
long int arr2[n]; 



for(i=0; i<n; i++){ 
    arr[i]=(i+1)*6; 

} 

//this function seems to do problems 
o=0; 
for(i=0; i<n-1; i++){ 
    for(s=1; s<n-i-1; s++){ 
     arr2[o]=arr[i+s]-arr[i]; o++; 
    } 
} 




    return 0; 
} 
+0

タグのすぐ下にある「編集」ボタンを使用して質問を編集し、あなたが見ているものだけにヒントを与えてください。エラーメッセージ?予想される結果と実際の結果間違った色? ??? –

+0

@BobJarvis私が言ったように、プログラムは出力なしでクラッシュします。 – SamS

+1

このプログラムは出力を生成しません。どのようにそれが墜落したと言うことができますか? –

答えて

3

それはなぜならこのラインのクラッシュ:特に

arr2[o]=arr[i+s]-arr[i]; o++; 

o++部分。入れ子にされたループの中で呼び出すので、o++n回以上呼び出されるため、割り当てられたバッファがオーバーフローします。

oは、この例では171に達した - ので、あなたのいずれかarr2が十分に大きい、または(可能性が高い)ようにする必要があり、外側のループにo++を移動します。

+0

また、arra2をもっと大きくしようとしましたが、長さを過小評価しているようです... n * 10はうまくいくようですが、今は印刷された値をチェックする必要があります。 – SamS

+1

外側のループにo ++を入れるのは意味がありません。内側のループを作るのではなく、単に次のように書くことができるからです。 arr2 [o ++] = arr [n - 2] - arr [i]; – koper89

+0

できますか?それは妥当と思われる。ありがとう。 – SamS

関連する問題