【问题标题】:What does this mean and how do I rectify it *** stack smashing detected ***: ./array1output terminated这是什么意思,我该如何纠正它***检测到堆栈粉碎***:./array1output 终止
【发布时间】:2017-05-16 05:14:26
【问题描述】:

这是代码。为什么我会遇到这个错误,我应该参考什么信息来源来纠正这些错误,以便我知道'如果我这样做,我会得到'x'错误'

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

【问题讨论】:

  • for(i=0;i&lt;31;i++) --> for(i=0;i&lt;30;i++)
  • int marks[30] 定义了一个大小为 30(0..29 个索引)的数组,但在您的 for loops 中,您正在访问不存在的标记 [30]。
  • 要添加到@MohammadH.Mofrad 的答案,当您写入标记[30] 时,您将写入程序不拥有的内存。并且程序崩溃了。有关更多信息,请参阅stackoverflow.com/questions/1345670/stack-smashing-detected

标签: c arrays loops gcc


【解决方案1】:

每当您在函数中声明变量时,它都会在堆栈上分配内存。堆栈是保留的内存区域,用于在函数内进行临时数据操作。现在,在您的代码中,您声明了 3 个ints 和一组ints,有30 个插槽。在您的 for 循环中,您将 31 个整数放入 30 个插槽中;从 0 到 30 是 31 个数字。最后一个数字被放在第 30 个插槽之外,因此“粉碎”到堆栈的下一个位置,换句话说,覆盖它。解决方案是将您的for 循环更改为for(i=0;i&lt;30;i++)

【讨论】:

    【解决方案2】:

    您已将 int 类型数组声明为 [30] 并尝试为其分配 31 个值。请注意,数组是从 0 开始的。所以 for 循环应该如下所述。 对于(i=0;i

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

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多