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

时间:2014-06-22 13:05:09

标签: c structure sizeof

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

#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));    


}

我认为结构的大小= 10 * 1 + 4 = 14.但是输出是

 The size of the integer on machine is   :: 4 

 The size of the char on machine is      :: 1 

 The size of structre is     :: 16 

2 个答案:

答案 0 :(得分:1)

查看维基百科的内容!

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

struct student{
  char grade; /* char is 1 byte long */
  int age; /* int is 4 bytes long */
};

printf("%zu", sizeof (struct student));

您应该尝试通过更改结构中char数组的大小来更好地理解

例如:

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

};  

回答为8

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

};

回答为12

答案 1 :(得分:0)

首先,您需要将%d更改为%zu,因为sizeof会返回size_t类型。

sizeof(p1)提供16个字节而不是14,因为填充2字节会添加到其中。

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

};