C语言如何将struct结构体转换为可操作数组 新手代码无输出求助
问题排查与修复方案
代码核心错误点
- 函数嵌套定义:C 标准不支持在函数内部定义其他函数,你将
student函数写在了main函数内部,属于基础语法错误,会导致编译失败。 - 数组越界:声明
struct Students stud[4]仅能存储4个元素(下标0~3),但代码中实际写入了5个学生数据,访问下标4属于越界操作,会触发未定义行为。 - 变量误用:
student函数内部自行创建了stud数组存储学生数据,但打印时错误传入了未初始化的形参st,无法读取到正确的学生信息。 - 主函数无执行逻辑:
main函数内仅定义了嵌套的student函数,没有任何可执行的调用逻辑,程序运行后直接退出,自然无任何输出。 - 函数返回值不符:声明的
student函数返回值为float,但实际返回整型0,且该函数不需要返回值,可改为void类型。
修正后可运行代码
#include<stdio.h> #include<stdlib.h> #include<string.h> struct Students { char name[20]; char surname[20]; int id; float lab; float kd; }; void printStudent(struct Students *st ); // 调整返回值为void,不需要额外参数 void initAndPrintStudents(void); int main() { // 主函数调用初始化打印逻辑 initAndPrintStudents(); return 0; } // 移出main函数,单独定义 void initAndPrintStudents(void){ // 数组大小改为5,适配5个学生数据 struct Students stud[5]; strcpy(stud[0].name, "John"); strcpy(stud[0].surname, "Doe"); stud[0].id = 456; stud[0].lab = 7.31; stud[0].kd = 8.55; strcpy(stud[1].name, "Tom"); strcpy(stud[1].surname, "K"); stud[1].id = 001; stud[1].lab = 9.25; stud[1].kd = 8.93; strcpy(stud[2].name, "Jane"); strcpy(stud[2].surname, "Dee"); stud[2].id = 201; stud[2].lab = 7.31; stud[2].kd = 6.55; strcpy(stud[3].name, "Alice"); strcpy(stud[3].surname, "Lee"); stud[3].id = 199; stud[3].lab = 8.95; stud[3].kd = 9.22; strcpy(stud[4].name, "Victor"); strcpy(stud[4].surname, "Mann"); stud[4].id = 167; stud[4].lab = 10.00; stud[4].kd = 9.50; // 传入正确的stud数组元素地址 printStudent(&stud[0]); printStudent(&stud[1]); printStudent(&stud[2]); printStudent(&stud[3]); printStudent(&stud[4]); } void printStudent(struct Students *st){ printf("%s \n", st->name); printf("%s \n", st->surname); printf("%d \n", st->id); printf("%.2f \n", st->lab); printf("%.2f \n\n", st->kd); }
后续排序实现提示
如果需要对结构体数组排序,可以使用标准库的qsort函数,自行编写对应排序规则的比较函数即可,按学号、按实验成绩、按总分排序都可以通过修改比较函数实现。
内容的提问来源于stack exchange,提问作者Rolandsga
相关产品推荐
相关产品推荐

