C编程结构作为强制转换传递给char*?

wak*_*eup 5 c

我有一点问题,在以下场景中:

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*对我来说没什么意义,它如何正确地迎合其他成员元素?

我不确定我是否正确地问这个问题,我希望有人可以解释我的精神错乱背后的问题并帮助我.

谢谢.

Dig*_*oss 6

歇斯底里的Raisens

转换缓冲区char *是经常看到的遗留代码模式.它经常被使用,以至于在它不再需要之后很久就会被输入.

在某一点上没有void类型,因此API read(2)会声明缓冲区参数,char *并且所有调用者都会将其数据转换 char *.

但是read(2)已经void *很久很久了.很长一段时间以来,必须在呼叫站点进行任何类型的演员表演.

但是,旧代码仍然存在,人们仍在阅读它,然后它们使设计模式永久化.

它没有任何伤害.

关于连续数据,正在发生两件事之一.数据结构和类型被设计为在大多数或所有可能的机器上密集布局,或者首先使用类似的语句将数据写出来,因此填充字节无关紧要,除非要移动数据文件不同的架构之间.


Joh*_*ler 3

它不会读取并正确对齐结构中的字段。它只获取结构的总大小 (from sizeof) 和起始地址 (from &dirbuf) 并读入该内存,而不考虑结构声明。

假设文件中的任何内容都已正确对齐以适合结构。

强制转换(char *)只是为了关闭编译器。 (void *)也会做得同样好。或者根本不进行强制转换,因为编译器会将指针类型转换为 void* 而不进行强制转换。