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。
以上程序是否与结构成员对齐填充和数据打包有关?
答案 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 node
和p
的大小。