猿问

为什么值会莫名地改变?

感谢各位的注意!

编译时没任何问题,只是在运行时问题很多;学生数不能多,用了12就出错;不知是什么情况?……………………各种问题;

愿意的可以试一试!

这是源文件:

/*计算任意多个班级的平均分*/ 
#include <stdio.h>

int main()
{
    int stu_num = 0;  //Declare the student's number and initiate it 
    int class_num =0;          //store the classes's number
    int count = 0;             //for index
    double grades[stu_num];   //Store students's grades
    double aver[class_num];    //Store every class's average
    double temp_sum = 0;          //Store every class's sum
    double temp_average = 0;  
    
    //获取班级数 
    printf("你们有几个班呀?:");
    scanf("%d",&class_num);

    for(int i = 1;i<=class_num;++i)
    {
        count = 0;
        printf("请输入第%d个班级的学生个数:",i);
        scanf("%d",&stu_num);
        printf("请输入每个学生的成绩:\n");    
        //Get every student's grade 
        for(int j = 0;j < stu_num;++j)
        {
            printf("%d>> ",j+1);
            scanf("%lf",&grades[count]);
            ++count;
        } 
        
        //Calculate the average and store it 
        temp_sum = 0;
        for(int k = 0;k < stu_num;++k)
            temp_sum += grades[k];
        temp_average = temp_sum/(double)stu_num;           //类型转换! 
        
        aver[i-1] = temp_average;
    }    
    
    for(int d = 0;d < class_num;++d)
    {
        printf("第 %d 个班级的平均分为: %lf\n",d,aver[d]);
    }    
    return 0;
}
AIxer
浏览 2076回答 5
5回答

MadMarical

你好。你的代码意思是动态的生成一个数组,比如输入classnum然后将这个classnum传入进数组。让数组也变成classnum这么大的。但是你建立数组的方式却是静态的,你已经初始化了一个classnum=0的数组,这个数组就是长度为0的数组。它不会因为你输入了一个classnum而变成长度为classnum大小的数组。如果要建立一个变长的数组,你需要在堆中开辟空间,在C中使用malloc 关键字,在C++使用new关键字。

醉梦尘缘

定义数组大小不能用变量

尼斯達Nesta_0

可变长数组是不能改变容量的,一开始已经stu_num=0和class_num=0,则两个double的数组大小都被定义成0个字节,因此后面for循环的访问属于越界访问。当两个数组越界位置如果没有数据存储则没有问题,如果本来已经有其余栈区数据占据这些内存,则会引发各种问题,而且每次运行出现的问题都有可能不同,结果都有可能每次都不同

尼斯達Nesta_0

可变长数组是不能改变容量的,一开始已经stu_num=0和class_num=0,则两个double的数组大小都被定义成0个字节,因此后面for循环的访问属于越界访问。当两个数组越界位置如果没有数据存储则没有问题,如果本来已经有其余栈区数据占据这些内存,则会引发各种问题,而且每次运行出现的问题都有可能不同,结果都有可能每次都不同

AIxer

怎么回事?
随时随地看视频慕课网APP
我要回答