2014-06-22 100 views
1

我正在写代码来检查int,char和一些struct.But的大小,但是它给出的结果与手动计算出的结果不同。使用SIZEOF运算符计算出的结果不同吗?

#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

http://stackoverflow.com/tags/c/info。而10 * 1 + 4是14,顺便说一句。 – mafso

+2

结构被填充 – bolov

回答

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 

}; 
+0

为什么2个字节被添加为填充? – alpha9eek

+0

对于[结构对齐](http://en.wikipedia.org/wiki/Data_structure_alignment),由于CPU处理内存的方式而增加了系统的性能。 – haccks

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

你应该改变字符数组的大小,你的结构以更好地理解

例如尝试:

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

}; 

给出答案为8

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

}; 

给出答案为12

+0

如果真的有帮助,你可以接受答案! ;) – Nullpointer