3

http://c-faq.com/strangeprob/ptralign.html

在 16.7 中,作者解释说:

s.i32 = *(long int *)p;
s.i16 = *(int *)p;

会遇到麻烦,因为这些强制转换的指针可能没有对齐。所以他改用字节操作来解决问题。

我的问题是,因为这段代码:

struct mystruct {
    char c;
    long int i32;
    int i16;
} s;

在'char c;'之后会有填充字节,为什么作者在尝试获取'long int i32;'时没有跳过填充?

4

1 回答 1

1

请记住,这应该是一个常见问题列表。你必须阅读QA,就好像它们是由不同的人写的一样。从理论上讲,Q实际上是被不知道答案的人经常问到的东西。实际上,它可能不是直接引用实际问题,而是由常见问题列表维护者组成的问题的一种理想化版本。但是,在写Q部分时,作者采用了不同的角色。

在这种情况下,提问的角色不知道对齐或填充。他编写char buf[7]了结构定义并认为它们都应该是 7 个字节长。7 字节缓冲区是提问者试图解析的外部数据格式(在文件或网络协议流中),结构表示他想将其解析成的变量,而类似的语句s.i32 = *(long int *)p;是他的失败尝试正在做。

A部分,我们的作者放弃了该角色,并给出了将数据从打包的 7 字节缓冲区传输到结构的正确方法。他没有解释应用于结构和字符缓冲区的对齐和填充规则的每个细节,因为他想保持答案简短。

您看到的是一个真正的老式新闻组常见问题解答列表,它旨在实际回答人们经常提出的问题,而不是企业网站样式的“常见问题解答”,其中营销团队编造虚假问题,旨在奉承公司,并避免回答任何投诉。(还有其他人记得当一个问题的常见问题解答和带有答案的常见问题解答列表的常见问题解答之间有区别吗?那去哪里了?)

于 2012-07-28T19:27:47.600 回答