【问题标题】:C program - Structure variable data packing and alignmentC程序 - 结构变量数据打包和对齐
【发布时间】:2015-07-31 07:49:09
【问题描述】:

程序在 32 位机器(使用 GCC)上的输出是什么?解释一下。

#include<stdio.h>

int main() {

     struct node {
         int data;
         struct node *link;
     };

     struct node *p, *q;
     p = (struct node *) malloc(sizeof(struct node));
     q = (struct node *) malloc(sizeof(struct node));
     printf("%d, %d\n", sizeof(p), sizeof(q));
     return 0;
}

输出显示

4, 4.

上述程序是否与结构成员对齐填充和数据打包有关?

【问题讨论】:

  • 使用%zu 打印size_t,正如其他人指出的,您正在打印指针的大小,请尝试:printf("%zu, %zu\n", sizeof(*p), sizeof(*q));

标签: c memory-management memory-alignment struct-member-alignment


【解决方案1】:

不,您只是打印指针的大小。与结构的内部成员布局无关。

【讨论】:

  • sizeof(p)sizeof(q) 都等价于 sizeof (struct node *),因为 pq 都是 struct node *s。
【解决方案2】:

在 32 位系统上,存储的地址总是 32 位大。如果要打印指针的大小,则基本上只是打印指向(32 Bit -&gt; 4 Byte) 的地址的大小。

如果您想知道结构的大小,请执行以下操作:

struct node p;
struct node q = {4, &p};

printf("%zu, %zu\n", sizeof(p), sizeof(q));

【讨论】:

    【解决方案3】:
    • 第 1 点使用%zu 格式说明符打印sizeof 类型为size_t 的输出。

    • 第二点注意p的类型,为struct node *,同q

    所以,基本上,sizeof(p)sizeof(q)sizeof(struct node *) 完全相同,在您的平台上是 32 位宽。由于您在这里没有考虑 变量,因此结构和成员的对齐和填充既不相关也不涉及 this 情况。

    也就是说,请看why not to castmalloc()C中的family的返回值。

    【讨论】:

    • %zu 不一定适用于每个系统,建议 OP 在这种情况下使用 %lu 的替代方案。
    • @shekharsuman 不,我不会。 §7.21.6.1,第 7 段阻止我这样做。 :-)
    • 那我会流利地给你投反对票。我在 Dev C++、Windows、32 位中遇到过这个问题。您应该接受批评,并愉快地将其应用到您的回答中......
    • @shekharsuman 不客气。如果我因提出正确 的建议而遭到反对,我会非常高兴。干杯!!
    • 如果您也没有为特殊情况提供 OP 的替代方案,并且如果有人建议您应该这样做,那么您就是非常粗鲁的人。如果你要求作为证据,那么我也可以给你一个证据。顺便说一句,我只是要求您进行编辑以揭示特殊情况。同样,这取决于您改进答案的意愿。
    【解决方案4】:

    不,它与结构成员对齐填充和数据打包无关。

    因为它是一个 32 位机器,所以任何指针的大小都是4 字节。由于 p 和 q 是 struct node * 类型,即指向 struct node 的指针,结果打印指针 pq 的大小。

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2023-03-23
      • 2010-12-13
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多