【问题标题】:*** stack smashing detected ***: terminated Aborted*** 检测到堆栈粉碎 ***: 终止 Aborted
【发布时间】:2021-07-18 03:56:19
【问题描述】:

我正在尝试创建一个程序,允许我为许多学生(1-25 之间)输入成绩。对于每个学生,我想输入一些成绩(1-10 之间)。对于每个学生,我应该根据我输入的年级数提供他们的名字和姓氏、年龄和平均成绩。这是一个分配,所以我需要在我的程序中有一个名为 Infostruct,并且在里面,它有 char 变量 firstNamelastNameint变量年龄float变量平均

#include <stdio.h> 
int gradeVar;
int studVar;       
struct Info {
    char firstName[20];
    char lastName[20];
    int age;
    int Exam;  //This is for something I planned to add later
    float Average;
};

int main() {
printf("How many students will you grade (1-25)? ");
     
     
    scanf("\n%i", &studVar);
    if (studVar<1 || studVar>25) {
        do{                                                
        printf("Invalid\n");                               
        printf("How many students will you grade (1-25)? ");
    scanf("\n%i", &studVar);
        } while (studVar<1 || studVar>25);
    }


printf("How many grades will you read per student (1-10)? ");       
    scanf("\n%i", &gradeVar);
    if(gradeVar<1 || gradeVar>10) {
        do{
            printf("Invalid\n");
            printf("How many grades will you read per student (1-10)? ");  
            scanf("\n%i", &gradeVar);                                      
        } while(gradeVar<1 || gradeVar>10);
    }
    
    struct Info Student[studVar];  
                                   
    for(int n=1; n <= studVar; ++n) {             
                                  
        printf("Enter First Name for student %i: ", n);
        scanf("\n%s", Student[n].firstName);
        printf("Enter Last Name for student %i: ", n);
        scanf("\n%s", Student[n].lastName);

//Every thing worked fine until I added the last two lines below//
        printf("Enter age for student %i: ", n);
        scanf("\n%d", &Student[n].age);
    };

    return 0;
}

直到我添加最后两行:

printf("Enter age for student %i: ", n);
        scanf("\n%d", &Student[n].age);

我的输出中有错误提示 stacked smasing

我不完全确定为什么会发生这种情况,也不知道在哪里修复它以便它按照我想要的方式运行。如果有人能为我澄清这一点,我将不胜感激。

【问题讨论】:

  • 您有名字或姓氏超过 19 个字符的学生吗?
  • 我们需要足够的信息来复制错误。任何输入都会发生这种情况吗?
  • 在循环的最后一次迭代中,n 等于数组的长度,导致越界写入。它应该是for(int n =0; n &lt; studVar; ++n) {
  • 哦,谢谢,我试图从 1 而不是 0 开始数字,以表明我在哪个学生。
  • 很高兴您的运行时系统捕获堆栈覆盖! C 的语义允许它在那种情况下做任何事情。阅读有关未定义行为的信息,例如blog.regehr.org/archives/213

标签: c


【解决方案1】:

预期:

for(int n=0; n < studVar; ++n) 

得到:

for(int n=1; n <= studVar; ++n) 

数组是基于 0 而不是基于 1。

如果您在名称组件中超过 19 个字符,则会有另一个溢出等着您。

【讨论】:

    【解决方案2】:

    在 C 中,当您声明 struct Info Student[studVar]; 时,该数组的有效索引是零到 studVar - 1不是 1 到 studVar

    因此循环内的scanf 语句应该使用n - 1 而不是n。您的问题是,当您输入2 作为学生人数时,您会得到Student[0]Student[1]

    尝试写信给Student[2].id 将导致未定义的行为,例如,嗯,...,我猜是堆栈粉碎:-)

    【讨论】:

    • 谢谢你,你的解释帮我解决了这个问题,我没有完全按照你告诉我的去做,但我只是在我的 printf 和 scanf 语句中添加了 n+1 就让它工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多