3

程序在 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。

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

4

4 回答 4

3

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

于 2015-07-31T07:53:09.937 回答
2

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

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

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

printf("%zu, %zu\n", sizeof(p), sizeof(q));
于 2015-07-31T07:58:56.917 回答
2
  • 第 1 点使用%zu格式说明符打印sizeof类型的输出size_t

  • Point 2注意 的类型p,它struct node *与 相同q

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

也就是说,请参阅为什么不将malloc()and family的返回值转换为C.

于 2015-07-31T07:59:43.083 回答
0

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

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

于 2015-07-31T08:18:53.917 回答