C语言结构体数组指针使用异常导致程序无法运行,该如何解决?
代码故障原因与修复方案
核心问题分析
- 结构体指针数组未初始化内存:代码中定义的
EXAM *exams[5]是包含5个EXAM类型指针的数组,所有指针默认是野指针,未指向任何合法分配的结构体内存空间,直接访问exams[i]->xxx成员会触发内存访问异常。 - 结构体内字符串指针未分配缓冲区:EXAM结构体中的
courseName、courseDate均为char类型指针,没有预先分配足够存储输入字符串的内存缓冲区,直接通过scanf写入内容同样会触发非法内存访问。
修复方案
可以直接将指针数组改为结构体数组,同时将结构体内部的char指针改为固定长度的字符数组,修改后代码如下:
#include <stdio.h> typedef struct { // 改为固定长度字符数组,直接分配存储空间 char courseName[100]; char courseDate[20]; double grade; }EXAM; int main() { double averageGrade = 0; // 改为结构体数组,直接分配5个EXAM结构体的内存空间 EXAM exams[5]; for(int i = 0; i < 5; i++){ printf("Please enter course name:\n"); scanf("%s", exams[i].courseName); printf("Please enter course date:\n"); scanf("%s", exams[i].courseDate); printf("Please enter course grade:\n"); scanf("%lf", &exams[i].grade); averageGrade += exams[i].grade; } averageGrade /= 5; printf("Your average grade is: %.1lf.", averageGrade); return 0; }
如果需要保留指针的用法,需要手动调用malloc为每个结构体指针和字符串指针分配内存,使用结束后调用free释放即可。
内容的提问来源于stack exchange,提问作者user15975143
相关产品推荐
相关产品推荐

