C语言 sizeof结构体问题

来源:百度知道 编辑:UC知道 时间:2024/06/19 17:15:44
#include<stdio.h>
typedef struct{
float score;
int num;
char name[10];
}st;
main()
{ st stu ;
scanf("%f%d%s",&stu.score,&stu.num,stu.name);
printf("%s's (%d)score is %f\n",stu.name,stu.num,stu.score);
printf("struct's size is %d\n",sizeof(stu));
printf("score's size is %d\n",sizeof(stu.score));
printf("num's size is %d\n",sizeof(stu.num));
printf("name's size is %d\n",sizeof(stu.name));
}
执行结果是
struct's size is 20
score's size is 4
num's size is 4
name's size is 10
stu占20个字节 , 按理说其元素加起来也应该是20么,但是只有18,另外两个字节存的什么?我知道结构体有个变量对齐,这个例子里是不是可以理解为socre和num 都变成了5个字节 ,好让stu中最大的变量字节数能整除他们?我的理解对不?还有哪位大哥能具体讲解一下这个规则
解释一下这个规则,或者给个网站我自己看

结构体(c++的类也是一样)字节对齐规则:
(1). 结构体成员按低地址到高地址的顺序存储在内存, 即按声明的顺序存储
(2). 每个成员的地址必须满足: 是 sizeof(该成员) 的整数倍
(3). 总的字节数是 最大内置(就是基本类型)成员所占的字节数的 整数倍.

完!

你的问题:
(char name[10] 可以看成10个char型的变量.)
4 + 4 + 10 = 18;
18 不是4的倍数, 那就再多用2个字节了.
字节对齐的目的是提高内存的访问效率.

不是
这里score和num还是4个字节,name占10个字节,出于对齐的需要,后面的2字节是不用的。
即内存中是这样的:
4 4 10 2
后面的两个字节是用来填充的

num的类型是整数类型“d",在C语言中,规定整数类型占4个字节,故num's size is 4 ,而score's size is 4 可以理解为"f"类型只占4个字节,至于stu有20,而里面的加起来却是18,这一点我也不太懂,估计stu这个结构体还存其他指针之类的吧。