c - 结构数组在声明时存储垃圾
问题描述
我正在创建一个包含 50 个结构的数组,并将其读入二进制文件。然后当我尝试打印它时,该结构对于前 24 个元素显示为空,但之后开始出现奇怪的行为(打印垃圾)。我特别希望 ID 为 0,因为我很可能会使用它进行测试。没有减少我的结构的大小,我傻眼了。
我正在创建二进制文件,如下所示:
#include<stdio.h>
#include<stdlib.h>
struct record
{
int id;
char name[40];
char email[50];
char course[10];
int grade;
};
int main ();
{
struct record tempadd[50];
FILE *in = fopen("records.bin", "ab");
fwrite(tempadd, sizeof(tempadd), 1, in);
fclose(in);
}
我正在使用以下代码打印记录:
#include<stdio.h>
#include<stdlib.h>
struct record
{
int id;
char name[40];
char email[50];
char course[10];
int grade;
};
int main ()
{
struct record record[50];
FILE *in = fopen("records.bin", "rb");
fread(record, sizeof(record), 1, in);
int i;
for (i=0; i<50; i++)
{
printf("Student ID: %d ", record[i].id);
printf("Name: %s ", record[i].name);
printf("Email: %s ", record[i].email);
printf("Course: %s ", record[i].course);
printf("Grade: %d\n", record[i].grade);
}
fclose(in);
}
我预计有 50 行:
Student I: 0 Name: Email: Course: Grade: 0
相反,我看到许多垃圾行,例如:
Student ID: 1724372348 Name: = Email: = Course: Grade:
解决方案
创建文件的代码有问题:
tempadd[50]
未初始化,要么将其声明为全局,要么使用您需要的值对其进行初始化。例如,如果你想Name
清空,你可以这样做tempadd[0].name = ""
。确保初始化所有数组元素。
您还可以使用memcpy
清除所有元素tempadd
。
推荐阅读
- sql - 用喜欢计数和分组依据 - PGSQL
- google-cloud-platform - BQ 错误:“引用的表由不同的后端支持,不能一起使用”
- c++ - Windows 10 - 任务栏 - 将项目添加到每个程序的上下文菜单
- javascript - 更新状态 -> 对象 -> 数组 -> 对象
- flutter - 使用 in_app_purchases 官方库在 Flutter 中使用促销代码在订阅中实现应用内促销
- css - Gulp SCSS 颜色变量到 css
- cordova - Cordova 应用程序无法打开 azure 媒体播放器视频
- angular - 如何在 Angular 中正确链接依赖的异步管道
- swift - Xcode 11.3.1 与 Firebase
- vb.net - 字符串未被识别为有效的日期时间:MyBase.Text = " / / "