包含两个指针的struct的大小

时间:2014-10-26 00:28:08

标签: c struct size

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

struct list_element
{
  short data;
  struct list_element* next;
  struct list_element* prev;
};

我尝试用这些公式计算尺寸:

  
      
  1. (sizeof(list_element *)+ sizeof(short))+((sizeof(list_element *)* 2)

         
        
    • (4 + 2)+(4 * 2)= 6 + 8 = 14
    •   
  2.   
  3. (sizeof(短))+(sizeof(list_element *)* 2)

         
        
    • 2 +(4 * 2)= 2 + 8 = 10
    •   
  4.   
  5. (sizeof(list_element *)+ sizeof(list_element *)+ sizeof(short))+(sizeof(list_element *)* 2)

         
        
    • (4 + 4 + 2)+(4 * 2)= 10 + 8 = 18
    •   
  6.   
  7. (sizeof(list_element *)+ sizeof(list_element *)+ sizeof(short))

         
        
    • (4 + 4 + 2)= 10
    •   
  8.   

但是,他们没有回复正确的答案。你用什么公式来计算这个结构的大小?

更新

我的老师说我们忽略了数据对齐...希望这不会让任何人失去太多,因为你使用的是处理与代码和结构的数据对齐......

更新2 感谢您的帮助和数据一致性的介绍。

答案是10没有数据对齐...不确定为什么我急于在C中使用数据对齐......这很有趣吗?

此外,数据对齐的答案是12.正如你们解释的那样,你必须对齐短数据以匹配整数。因此,你有(2 +(2个额外字节))+ 4 + 4 = 12。

3 个答案:

答案 0 :(得分:7)

结构的大小由:

给出

size_t size = sizeof(struct list_element);

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

另一件需要注意的事情是,结构的大小可能不仅仅是各个成员的sizeof的总和,因为结构中的存储通常用于对齐目的。因此,在您的短名称和下一名成员之间,填充将导致额外的大小。

我使用可能这个词的原因是,如果您的来源中使用了 pragma pack 指令,则打包对齐可以更改,导致sizeof的值不同。

关于结构对齐填充的两个好讨论 A general discussion here < EM> How to reduce memory footprint here 即可。第二个链接特别有趣,因为它处理结构对齐,填充和位字段,以及每个链接如何影响内存使用。

答案 1 :(得分:2)

虽然您的老师要求忽略数据对齐,但该结构的大小为10个字节,假设short为2个字节..但实际上short大小并未修复,但至少 2个字节!

看看here。你没有正确报告老师的问题吗?

答案 2 :(得分:1)

这将返回结构的大小:

sizeof(struct list_element);