我有一点问题,在以下场景中:
while (read(dp->fd, (char *) &dirbuf, sizeof(dirbuf)) == sizeof(dirbuf)) { ... }
Run Code Online (Sandbox Code Playgroud)
其中dirbuf是:
struct direct dirbuf {
ino_t d_ino; char d_name[DIRSIZ];
};
Run Code Online (Sandbox Code Playgroud)
C如何知道将数据连续读入我们的结构?使用read()Like,我们的dirbuf的对齐非常适合作为字符数组?因为read接受一个void*作为它的第二个参数,将一个结构作为一个转换传递给char*对我来说没什么意义,它如何正确地迎合其他成员元素?
我不确定我是否正确地问这个问题,我希望有人可以解释我的精神错乱背后的问题并帮助我.
谢谢.
转换缓冲区char *是经常看到的遗留代码模式.它经常被使用,以至于在它不再需要之后很久就会被输入.
在某一点上没有void类型,因此API read(2)会声明缓冲区参数,char *并且所有调用者都会将其数据转换为 char *.
但是read(2)已经void *很久很久了.很长一段时间以来,必须在呼叫站点进行任何类型的演员表演.
但是,旧代码仍然存在,人们仍在阅读它,然后它们使设计模式永久化.
它没有任何伤害.
关于连续数据,正在发生两件事之一.数据结构和类型被设计为在大多数或所有可能的机器上密集布局,或者首先使用类似的语句将数据写出来,因此填充字节无关紧要,除非要移动数据文件不同的架构之间.
它不会读取并正确对齐结构中的字段。它只获取结构的总大小 (from sizeof) 和起始地址 (from &dirbuf) 并读入该内存,而不考虑结构声明。
假设文件中的任何内容都已正确对齐以适合结构。
强制转换(char *)只是为了关闭编译器。 (void *)也会做得同样好。或者根本不进行强制转换,因为编译器会将指针类型转换为 void* 而不进行强制转换。