int main()
{
struct node
{
char i;
int a;
};
printf("sizeof(struct node) =%d\n",sizeof(struct node));
return 0;
}
该程序的输出为8字节。这里sizeof(int)+ size(char)不等于8字节。不过,我们得到的是8字节。这是因为填充。没关系。但是在下面的程序中,这个概念被违反了。为什么呢?
int main()
{
struct node
{
double i;
int a;
};
printf("sizeof(struct node) =%d\n",sizeof(struct node));
return 0;
}
如果sizeof(double)是8字节,那么sizeof(struct node)应该是16字节(按照第一个程序)。但它打印12个字节。为什么呢?
答案 0 :(得分:2)
我在我的系统上尝试过,即使我将a定义为char,它也会返回16。 那是因为填充与机器有关。
答案 1 :(得分:0)
首先,数据类型和结构填充的大小取决于您的机器架构以及您正在使用的编译器。
结构分配内存是结构的所有元素大小的总和。 在32位int的情况下,int是4字节,double是8字节。 我认为你在32位机器上运行,这就是你得到4(int)+ 8(double)= 12 byte的原因。
如果您将在不同的架构上运行,输出将根据数据类型和结构填充的大小而有所不同。
答案 2 :(得分:0)
这是由于字节对齐和填充导致结构出现在32位(可能)平台上的12个字节(或字)。
例如,如果我使用它:
struct first
{
int a;
int b;
}first;
struct second
{
int a:4;
int b:8;
}second;
首先,当我使用sizeof(struct first)
时,它将输出8(即2 X 4字节整数)。但在第二种情况下,它不是12位(4 + 8),而是在第二个结构被填充时给出4作为一个值,使它成为一个单词(在32位系统中)。