繁体   English   中英

*** 检测到堆栈粉碎 ***: 终止 Aborted

[英]*** stack smashing detected ***: terminated Aborted

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

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

我的 output 出现错误说堆叠粉碎

在此处输入图像描述

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

预期的:

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

得到:

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

Arrays 是基于 0 而不是基于 1。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM