C 包含两个指针的结构的大小

C 包含两个指针的结构的大小,c,struct,size,C,Struct,Size,这个结构的大小是多少?(32位系统计算。不是64位。) 我曾尝试使用以下公式计算尺寸: (sizeof(list_element*)+sizeof(short))+((sizeof(list_element*))*2) (4+2)+(4*2)=6+8=14 (sizeof(short))+(sizeof(list_element*)*2) 2+(4*2)=2+8=10 (sizeof(列表元素*)+sizeof(列表元素*)+sizeof(短))+(sizeof(列表元素*)*2) (

这个结构的大小是多少?(32位系统计算。不是64位。)

我曾尝试使用以下公式计算尺寸:

  • (sizeof(list_element*)+sizeof(short))+((sizeof(list_element*))*2)

    • (4+2)+(4*2)=6+8=14
  • (sizeof(short))+(sizeof(list_element*)*2)

    • 2+(4*2)=2+8=10
  • (sizeof(列表元素*)+sizeof(列表元素*)+sizeof(短))+(sizeof(列表元素*)*2)

    • (4+4+2)+(4*2)=10+8=18
  • (sizeof(列表元素*)+sizeof(列表元素*)+sizeof(短))

    • (4+4+2)=10
  • 但是,它们不会返回正确的答案。您使用什么公式来计算此结构的大小

    更新:

    我的老师说我们忽略了数据对齐…希望这不会让任何人太过反感,因为您已经习惯于使用代码和结构处理数据对齐

    更新2 感谢您对数据对齐的帮助和介绍

    答案是10没有数据对齐…不知道为什么我这么急着在C中使用数据对齐…有趣吗


    此外,数据对齐的答案是12。正如你们所解释的,必须对短字符进行数据对齐以匹配整数。因此,您有(2+(2个附加字节))+4+4=12。

    结构的大小由以下公式给出:

    size\u t size=sizeof(结构列表元素);

    事实上,有两个成员是指向结构的指针,这意味着 您正在添加两次指针大小。在32位构建中,sizeof将解析为每个指针额外4个字节,在64位构建中,它将导致每个指针额外8个字节

    另一件需要注意的事情是,结构的大小可能不仅仅是单个成员的大小之和,因为结构中的存储通常是为了对齐而填充的。因此,在短成员和下一个成员之间,填充将导致额外的大小

    我使用“可能”这个词的原因是,如果在源代码中使用了指令,则可能会更改打包对齐方式,从而导致sizeof的值不同


    关于结构对齐填充的两个很好的讨论:。第二个链接特别有趣,因为它涉及结构对齐、填充和位字段,以及它们如何影响内存使用。

    这将返回结构的大小:

    sizeof(struct list_element);
    

    虽然您的老师要求忽略数据对齐,但假定
    short
    为2个字节,该结构的大小为10个字节。但实际上
    short
    大小不是固定的,而是至少2个字节


    看一看。你正确地报告了老师的问题吗?

    sizeof(struct list\u元素)
    (带填充的缩写)+(struct list\u元素*)*2可能的重复没有公式可以给你正确的答案。你的C编译器可以决定使用多少额外的填充字节,就像编写它的程序员觉得浪费一样!然后是“测验”这是垃圾,因为这是一个没有正确答案的问题,答案总是正确的。每个编译器都会使它不同。我敢打赌,编写该测试的人只会在自己的编译器上检查它是什么。现在你比他聪明。删除该测试。这意味着你必须填充,即使短的在指针之前?大多数示例我在互联网上看到,只有当较小的数据成员在较大的数据成员之后时,才计算填充。我将尝试一下。我可能在看(4+(4*2))=12。@rykker感谢您的解释!当我不得不再次处理数据对齐时,我会再次参考这篇文章。@ProgrammerMJM-我已经编辑了我的文章,其中有两篇关于填充如何工作的非常好的讨论。但是关于您的问题:这意味着您必须填充,即使…填充是处理器体系结构所要求的,而不是语言所要求的。你不必做任何事情来填充,填充是自动发生的。你可能指的是描述位字段使用的部分(我不确定)记住,int将始终包含
    sizeof int
    字节(不是位)。回答您的问题的最佳方法是尝试该链接中的一些有趣的示例,自己编译并调整它们的大小,看看结果会是什么。是的。她发回电子邮件说我们现在忽略了数据对齐。我刚刚得出了假设数据对齐的结论。
    sizeof(struct list_element);