CS50 Wk4结构如何知道如何分配内存
目前在wk4上,有几个问题我在别处找不到答案 在问题集中,BitMapInfo标头被定义为具有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;
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)
,然后将该数字传递给freadfread
不知道有关结构的任何信息,它只读取您告诉它读取的字节数:sizeof>(BITMAPFILEHEADER)*1
字节。它将这些字节放入bf
变量的内存中
假设该文件先前是使用类似的fwrite()
调用编写的,因此它将结构的字节写入该文件,然后将这些字节读入具有相同声明的另一个结构
编译器将始终以相同的方式为结构布局内存,因此,如果您以这种方式写入和读取结构,您将返回相同的值。但是,请注意,只有在使用相同或兼容的编译器时,这才是正确的。该语言未指定如何在内存中表示数字,这取决于实现。因此,如果如果您在Windows计算机上编写二进制文件,并尝试在Linux计算机上读取该文件,则可能无法获得相同的数据值