C 与使用SIZEOF运算符计算的结果不同?

C 与使用SIZEOF运算符计算的结果不同?,c,structure,sizeof,C,Structure,Sizeof,我正在编写代码来检查int、char和一些结构的大小,但它给出的结果与手动计算的结果不同 #include<stdio.h> struct person { int roll; char name[10]; }; void main() { struct person p1; printf("\n The size of the integer on machine is \t :: %d \n ",sizeof(int)); print

我正在编写代码来检查int、char和一些结构的大小,但它给出的结果与手动计算的结果不同

#include<stdio.h>
struct person
{
    int roll;
    char name[10];

};  
void main()
{
    struct person p1;
    printf("\n The size of the integer on machine is \t :: %d \n ",sizeof(int));
    printf("\n The size of the char on machine is \t :: %d \n ",sizeof(char));

    printf("\n The size of structre is \t :: %d \n",sizeof(struct person)); 
    printf("\n The size of structre is \t :: %d \n",sizeof(p1));    


}

首先,您需要将
%d
更改为
%zu
,因为
sizeof
返回
size\u t
类型

sizeof(p1)
给出的是
16
字节,而不是
14
,因为它添加了填充
2
字节

struct person
{
    int roll;      // 4 bytes
    char name[10]; // 10 bytes. 2 bytes are needed for structure alignment 

};  

看看维基百科怎么说

要计算任何对象类型的大小,编译器必须考虑满足效率或体系结构约束所需的任何地址对齐。许多计算机体系结构不支持从不是字大小倍数的任何字节地址开始的多字节访问,即使体系结构允许,处理器获取字对齐对象的速度通常比获取跨越内存中多个字的对象的速度更快。[4]因此,编译器通常至少将数据结构与一个单词对齐边界对齐,并将单个成员与各自的对齐边界对齐。在下面的示例中,结构student可能在单词边界上对齐,这也是成员等级开始的位置,成员年龄可能从下一个单词地址开始。编译器根据需要在成员之间插入未使用的“填充”字节以满足对齐要求,从而完成后者。在结构的末尾也可能有填充,以确保在结构用作数组元素时正确对齐。 因此,C中结构的总尺寸可能大于其单个构件尺寸之和。例如,在许多系统上,以下代码将打印8:

您应该尝试改变结构中字符数组的大小,以便更好地理解

例如:

struct person
{
    int roll;
    char name[4];

};  
答案为8

struct person
{
    int roll;
    char name[7];

};

给出的答案为12

。顺便说一句,10*1+4等于14。结构是填充的。为什么要添加2个字节作为填充?由于CPU处理内存的方式,为了提高系统的性能。如果确实有帮助,您可以接受答案!;)
struct person
{
    int roll;
    char name[4];

};  
struct person
{
    int roll;
    char name[7];

};