CS50 Wk4结构如何知道如何分配内存

CS50 Wk4结构如何知道如何分配内存,c,cs50,C,Cs50,目前在wk4上,有几个问题我在别处找不到答案 在问题集中,BitMapInfo标头被定义为具有 typedef struct { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter;

目前在wk4上,有几个问题我在别处找不到答案

在问题集中,BitMapInfo标头被定义为具有

typedef struct
{
    DWORD  biSize;
    LONG   biWidth;
    LONG   biHeight;
    WORD   biPlanes;
    WORD   biBitCount;
    DWORD  biCompression;
    DWORD  biSizeImage;
    LONG   biXPelsPerMeter;
    LONG   biYPelsPerMeter;
    DWORD  biClrUsed;
    DWORD  biClrImportant;
} __attribute__((__packed__))
BITMAPINFOHEADER;
在包含代码本身的文件中,我们创建一个这种类型的变量,然后将输入文件读入该变量

BITMAPFILEHEADER bf;
    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
我不明白的是

fread如何知道前两个字节是biSize,下一个x字节是biWidth?fread如何解析字节并知道将读取的字节放入哪个元素


仍然是一个巨大的初学者试图学习,所以感谢您的帮助

fread
不知道字节的含义。它不解析任何内容。它只是将一些字节,
sizeof(BITMAPFILEHEADER)
放入内存位置
bf


编译器知道有多少字节
BITMAPFILEHEADER
的大小,可以用该数字替换
sizeof(BITMAPFILEHEADER)
,然后将该数字传递给
fread

fread
不知道有关
结构的任何信息,它只读取您告诉它读取的字节数:
sizeof>(BITMAPFILEHEADER)*1
字节。它将这些字节放入
bf
变量的内存中

假设该文件先前是使用类似的
fwrite()
调用编写的,因此它将结构的字节写入该文件,然后将这些字节读入具有相同声明的另一个结构

编译器将始终以相同的方式为结构布局内存,因此,如果您以这种方式写入和读取结构,您将返回相同的值。但是,请注意,只有在使用相同或兼容的编译器时,这才是正确的。该语言未指定如何在内存中表示数字,这取决于实现。因此,如果如果您在Windows计算机上编写二进制文件,并尝试在Linux计算机上读取该文件,则可能无法获得相同的数据值