首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C代码不会在Scanf之后运行。有一个错误代码声明:异常未处理

C代码不会在Scanf之后运行。有一个错误代码声明:异常未处理
EN

Stack Overflow用户
提问于 2022-11-18 14:01:21
回答 1查看 56关注 0票数 0

我使用一个函数来使用MALLOC创建一个动态数组。

使用SCANF获取用户输入。出于某种原因,我得到了以下错误声明:

** 0x00007FFEE518D646 (ucrtbased.dll)处的未处理异常( Project4STRUCTS.exe: 0xC0000005:访问冲突写入位置0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD7E350)。

密码

问题在称为INPUT_DATA的函数中

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS

#define SIZE 3

#include<stdio.h>

typedef struct student_init_data {
    
    int ID;
    int* StudentGradeArray;
    int NumOfExams;

}Student_init_data;

typedef struct student_processed_data {
    
    int ID;
    int StudentAvg;

    
}Student_processed_data;

typedef struct statistics {

    Student_processed_data* HIGH;
    Student_processed_data* LOW;
    int SizeofHIGH;
    int SizeofLOW;
    int Tavg;


}Statistics;


int* Input_Data(int Exams) {

    int i;
    int* arr = (int*)malloc(Exams * sizeof(int));

    for (i = 0;i < Exams;i++)
    {
        printf("enter Grade: ");
        scanf("%d", &arr[i]);

    }

    return arr;


}

int Student_Average(int* GradeArray,int NumofExams) {

    int i;
    int avg=0;
    for (i = 0;i < NumofExams;i++)
        avg = avg + GradeArray[i];
    avg = avg / NumofExams;
    return avg;

}

int Total_Average(Student_processed_data StudentAVG[SIZE], int NumofStudents) {

    int i;
    int avg = 0;
    for (i = 0;i < NumofStudents;i++)
        avg = avg + StudentAVG[i].StudentAvg;
    avg = avg / NumofStudents;
    return avg;

}


void Classification(Student_init_data InitStudentData[SIZE],Statistics *pStats) {

    int i;
    Student_processed_data StudentAVG[SIZE];

    pStats->SizeofHIGH = 0;
    pStats->SizeofLOW = 0;


    for (i = 0;i < SIZE;i++)
        StudentAVG[i].ID = InitStudentData[i].ID;


    for (i = 0;i < SIZE;i++)
    {
        StudentAVG[i].StudentAvg = Student_Average(InitStudentData[i].StudentGradeArray, InitStudentData[i].NumOfExams);
    }

    pStats->Tavg = Total_Average(StudentAVG, SIZE);


    for (i = 0;i < SIZE;i++)
    {
        if (StudentAVG[i].StudentAvg >= pStats->Tavg)
            (pStats->SizeofHIGH)++;
        else
            (pStats->SizeofLOW)++;


    }


    pStats->HIGH = (Student_processed_data*)malloc((pStats->SizeofHIGH) * sizeof(Student_processed_data));
    pStats->LOW = (Student_processed_data*)malloc((pStats->SizeofLOW) * sizeof(Student_processed_data));



    for (i = 0;i < SIZE;i++)
    {

        if (StudentAVG[i].StudentAvg >= pStats->Tavg)
            (pStats->HIGH)[i] = StudentAVG[i];// High=pointer||same as High[i]
        else
            (pStats->LOW)[i] = StudentAVG[i];// HIGH={ID,AVG}, StudentAVG={ID,AVG}
    }



}

void Print_Tab(Statistics Stats) {

    int i;
    printf("Total Average is:%d ", Stats.Tavg);
    printf("\n %d number of students had AVG higher than TAVG:\n", Stats.SizeofHIGH);
    
    for (i = 0;i < Stats.SizeofHIGH;i++)
    {
        printf("ID:%d , AVG:%d | ", (Stats.HIGH)[i].ID, (Stats.HIGH)[i].StudentAvg);
    }
    printf("\n %d number of students had AVG lower than TAVG:\n", Stats.SizeofLOW);

    for (i = 0;i < Stats.SizeofLOW;i++)
    {
        printf("ID:%d , AVG:%d | ", (Stats.LOW)[i].ID, (Stats.LOW)[i].StudentAvg);
    }


}

void Free_Mem(Statistics* Pfreestat, Student_init_data* PfreeStudentData) {

    
    free(Pfreestat->LOW);
    free(PfreeStudentData->StudentGradeArray);
    free(Pfreestat->HIGH);
}

void main() {

    int i;
    Student_init_data StudentData[SIZE];
    Statistics Stats;
    

    for (i = 0;i < SIZE;i++)
    {
        printf("\nEnter Stundent Num %d ID and Number of Exams:\n", i + 1);
        scanf("%d", &StudentData[i].ID);
        scanf("%d", &StudentData[i].NumOfExams);
        StudentData[i].StudentGradeArray = Input_Data(StudentData[i].NumOfExams);

    }



    Classification(StudentData ,&Stats);
    Print_Tab(Stats);
    Free_Mem(&Stats,&StudentData);




    

}

错误信息

谢谢大家,艾亚尔

我试着调试以查看问题,但我无法理解这个问题是由SCANF引起的。

我试着在网上调查这个特定的例外,却找不到同样的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-18 14:17:38

一些问题:

  1. 您应该包括用于内存管理功能的#include <stdlib.h>
  2. Free_Mem(&Stats,&StudentData);更改为Free_Mem(&Stats,StudentData);,因为StudentData是一个结构数组。
  3. free(PfreeStudentData->StudentGradeArray);更改为for (int i = 0; i < SIZE; i++) free(PfreeStudentData[i].StudentGradeArray);
  4. void main()是非标准C.最好使用int main()并在完成时返回0.

试着做这些改变。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74490818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档