C语言关于结构的一道题

来源:百度知道 编辑:UC知道 时间:2024/06/06 17:53:25
#include<stdio.h>
void main()
{
struct strudent
{
char id[5],name[10];
int salary;
}peter;
printf("%d",sizeof(peter));
}
最后算peter所占内存的大小,结果应该是多少? 运行后的结果是20,觉得很奇怪, 两个字符数组分别占了5B和10B,然后一个整形的占4B,这样加一起有19B 啊 为什么是20B的内存空间?

这个涉及到字节对齐的问题,字节对齐到CPU的子长宽度,这样可以提高访问速度

具体的字节对齐策略,不同的编译器会有不同的表现

内存分配有个粒度的问题, 就好象不同磁盘最小分配单位不一样 是一个道理! 因为要考虑效率的问题!

具体来说:
id占5个字节,name占10个字节,salary占4个字节
由于id+name的长度不能被2整除,name后面补一个无用的字节
加在一起,就是20个字节了

#include<stdio.h>
void main()
{
struct strudent
{
char id[5],name[10];
int salary;
}peter={"abcd","12",2};

printf("%d",sizeof(peter));
}
你可以在调试环境下,看到&peter=0x0012ff6c
这个地址里面的内容是:
0012FF6C 61 62 63 64 00 31 32 00 abcd.12.
0012FF74 00 00 00 00 00 00 00 CC ........
0012FF7C 02 00 00 00

其中,第二行最后的CC就是补充的无用字节

这个涉及到字节对齐的问题,字节对齐到CPU的子长宽度,这样可以提高访问速度

具体的字节对齐策略,不同的编译器会有不同的表现

内存分配有个粒度的问题, 就好象不同磁盘最小分配单位不一样 是一个道理! 因为要考虑效率的问题!