C语言录入学生信息输出乱码且年龄为0是什么原因
程序运行异常的原因分析
本次异常是多个内存操作错误共同导致的,具体原因如下:
- 内存分配完全不符合需求
- 初始化阶段
countOfStudents初始值为0,执行student* students = malloc(countOfStudents);仅申请了0字节内存,完全无法存储学生结构体数据。 - 每次新增学生前没有对
students指向的堆内存执行扩容操作,直接向students[countOfStudents]写入数据属于非法越界写内存,会随机破坏内存中的其他数据,直接导致输出乱码、年龄字段取值异常。 - 内存申请时未乘以单个
student结构体的大小,即便countOfStudents不为0,分配的空间也远小于存储对应数量学生需要的内存。
- 初始化阶段
- 结构体赋值逻辑错误
代码中struct Student student = {*name, age};的初始化写法错误:*name是取输入姓名字符串的第一个字符,只会给结构体的name数组第一个元素赋值,数组剩余的49个元素都是未初始化的垃圾值,最终拷贝出来的姓名字段自然会出现乱码。 - 不规范写法隐患
scanf("%s", &name);写法错误,name本身就是字符数组的首地址,不需要额外加取地址符&,该写法存在潜在的内存访问异常风险。
内容的提问来源于stack exchange,提问作者Suleyman Selcuk
相关产品推荐
相关产品推荐

