2017-01-02 58 views
3

这是代码。为什么我面对这个错误,我应该是指什么来源的信息,以纠正这种错误,让我了解“如果我这样做,这样一来,我会得到‘X’错误”这是什么意思,我该如何纠正它***堆栈粉碎检测***:./array1output终止

#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;我<31;i++)' -->'为(I = 0; I <30;我++)' – chux

+0

的'诠释标记[30]'限定尺寸为30(为0的数组.. 29个索引),但在你的'for loops'中,你正在访问不存在的标记[0123]。 – hmofrad

+0

要添加到@ MohammadH.Mofrad的回答中,当你写入标记[30]时,程序没有自己。程序崩溃。请参阅这个更多的信息http://stackoverflow.com/questions/1345670/stack-smashing-detected – Sush

回答

2

每当你在一个函数中声明一个变量,它在栈上分配内存。该堆栈是用于在该函数内进行临时数据操作的保留存储区域。现在在您的代码中,您声明了3个int s和一个包含30个插槽的int s的数组。在您的for循环中,您将31个插入到30个插槽中;从0到30是31个数字。最后一个数字超过第30个插槽,因此“砸”到堆栈中的下一个位置,换句话说覆盖它。解决方法是将您的for循环更改为for(i=0;i<30;i++)

0

你已经声明了一个int类型数组为[30],并试图给它分配31个值。请注意,数组从0开始。因此,for循环应如下所述。 for(i = 0; i < 30; i ++) 因此,请更改for循环,并在代码中休息。谢谢。 :)

#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); 
} 
相关问题