首页 > 解决方案 > 结构数组在声明时存储垃圾

问题描述

我正在创建一个包含 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:

标签: carraysstruct

解决方案


创建文件的代码有问题:

tempadd[50]未初始化,要么将其声明为全局,要么使用您需要的值对其进行初始化。例如,如果你想Name清空,你可以这样做tempadd[0].name = ""。确保初始化所有数组元素。

您还可以使用memcpy清除所有元素tempadd


推荐阅读