2017-01-02 6 views
3

これはコードです。なぜ私はこのエラーを直面していますし、情報のどのようなソースは、私はX「エラー 『これは何を意味し、どのように修正するのですか?***スタックスマッシングが検出されました***:./array1output terminated

#include<stdio.h> 
void main() 
{ 
    int i,avg,sum; 
    int marks[30]; // Array declaration 

    for(i=0;i<31;i++) 
    { 
     printf("Enter Marks:"); 
     scanf("%d",&marks[i]); // Stores data in Array 
    } 

    for(i=0;i<31;i++) 
     sum=sum+marks[i]; 

    avg=sum/30; 
    printf("Average marks of student \t %d",avg); 
} 
+5

'用(i = 0; I <31;i++)' -->'用(i = 0; iは30 <; iは++) ' – chux

+0

'マークが[30] 'サイズ30(0の配列を定義int型.. 29インデックス)、あなたの 'forループ 'では存在しないマーク[30]にアクセスしています – hmofrad

+0

@ MohammadH.Mofradの答えに追加するには、マーク[30]に書き込むときに、プログラムが所有していません。プログラムがクラッシュします。詳細はこちらhttp://stackoverflow.com/questions/1345670/stack-smashing-detected – Sush

答えて

2

たびに』私はこのような方法を行う場合、私はなります」知ってもらうように、このようなエラーを修正するように参照する必要がありますスタックにメモリを割り当てる関数に変数を宣言します。スタックは、関数内で一時的なデータ操作を行うための予約済みメモリ領域です。あなたのコードでは、3つのintと、30スロットのintの1つの配列を宣言しました。 forループでは、30のスロットに31の整数を入れます。 0から30までは31の数字です。最後の数字は30番目のスロットを越えて配置されているため、スタック上の次の場所に「スマッシュ」して、つまり上書きしています。解決方法はforループをfor(i=0;i<30;i++)に変更することです。

0

int型の配列を[30]と宣言し、31個の値を割り当てようとしました。配列は0から始まることに注意してください。したがって、forループは以下のように記述する必要があります。 for(i = 0; i < 30; i ++) したがって、forループとrestを変更してください。ありがとうございました。 :)

#include<stdio.h> 
void main() 
{ 
int i, avg, sum=0; 
int marks[30]; // Array declaration 

for (i = 0; i<30; i++) 
{ 
    printf("Enter Marks:"); 
    scanf("%d", &marks[i]); // Stores data in Array 
} 

for (i = 0; i<30; i++) 
    sum = sum + marks[i]; 
    avg = sum/30; 
printf("Average marks of student \t %d", avg); 
} 
関連する問題