前言:
上一篇已经讲了结构体的基本用法。相信各位小伙伴以经学会怎么使用。但是还有一个问题没有弄明白——结构体到底多大,占内存空间多不多,以经系统到底怎么访问结构体内的数据的。
接下来,详细分析一下结构体的内在……
目录
1.修炼内功,掌握结构体的内存对齐
上篇已经讲述了结构体的基本使用,现在来深入探究下一个问题:计算结构体的大小。这个问题也会经常出现在各个大厂的笔试题目中,即——结构体对齐。
话不多说。直接在下面的代码中感受下:
int main()
{
//练习1
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
//练习2
struct S2
{
char c1;
char c2;
int i;
};
printf("%d\n", sizeof(struct S2));
return 0;
}
(留给空间给盆友么思考!!!先思考,再看下面的)
盆友们,对于练习1和练习2的的答案是多少呢?
相信刚接触的铁子们肯定觉得s1和s2的长度都是6吧(32位系统中)。这很简单呀,s1和s2里面都是char char int 三个变量类型,为 1 1 4。所以加起来是6咯。这有啥难的。
其实,非也。咱们调试起来瞧瞧看。
是 12 和 8……
为啥会这样呢?
12 和 8 这个答案是不是说明了s1和s2里面的数据居然不是挨着存的(如果是挨着的,就是6),显然之间存了空白的东西。
既然结构体里面存了空白的位置,那么不妨试试看,结构体内两个变量之前到底相隔多少空白位。
这里用到offsetof函数:
这个函数是用来计算结构体成员相对于结构体起始位置的偏移量。(不理解没关系,下面会有图解。)
函数的用法可以参考: