C程序 - 结构可变数据打包和对齐

时间:2015-07-31 07:49:09

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

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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

如果你想知道结构的大小做这样的事情:

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

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

答案 2 :(得分:2)

  • 第1点使用%zu格式说明符打印sizeof类型size_t的输出。

  • 第2点请注意p的类型,struct node *,与q相同。

因此,基本上,sizeof(p)sizeof(q)sizeof(struct node *)完全相同,malloc()在您的平台上为32位宽。由于您未在此处考虑变量,因此结构和成员的对齐和填充既不相关也不涉及案例。

也就是说,请C char Foo(int a) { if(a>0) return 'a'; else return 0; } const char NULL = 'b'; 的家人返回why not to cast的返回值。

答案 3 :(得分:0)

  

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

由于它是32位机器,因此任何指针的大小都为((TextView)findViewByID(R.id.secs_label)).setText(getResources().getString(R.string.secs, 25)); 个字节。由于p和q的类型为4,即指向struct node *的指针,结果会打印指针struct nodep的大小。