结构体{ 数组 }

对于结构体中包含数组这种情况,还是比较常见的。按照数组的规则,和结构体嵌套结构体的规则,可以猜测:相当于将数组打开为多个同样大小的结构体成员。验证:

struct test_st{
char meat[3];
}test;
Size: 3 Address: 0x00000001004071a4

struct test_st{
char meat[3];
char vegatable;
int fruit;
}test;
Size: 8 Address: 0x00000001004071a8

这里能得到 8,说明是数组展开的方式,即 8=3+1+4。如果第二个 char 换成 short,应该是 3+1(padding)+2+2(padding)+4 = 12:

struct test_st{
char meat[3];
short vegatable;
int fruit;
}test;
Size: 12 Address: 0x00000001004071a8

果不其然。至此我们可以得到结论:


a. 结构体中包含数组时,结构体的大小等于数组展开为多个同样大小的成员后再整体计算得到的结构体大小。
b. 结构体中包含数组时,结构体的首地址只与整个结构体的size 有关,和结构体本身的规则相同。

数组 { 数组 } = 多维数组

数组中嵌套数组,其实就是我们说的多维数组,因其中每个元素类型都相同,所以应该和一维数组的规律没有差异。

typedef char inner[3];
inner test[2];
Size: 6 Address: 0x00000001004071a4

是的,与我们的猜想是一样的。为了避免表达上的差异,我们再改写一下:

char test[2][3];
Size: 6 Address: 0x00000001004071a4

结论:

a. 数组中嵌套数组,其大小 Size = 每个元素大小 * 总元素个数。
b. 数组中嵌套数组,其起始地址与 Size 有关,规则同数组本身的规则。

共用体 { 数组 }

共用体中嵌套数组

union test_u{
char grass[20];
char tree;
}test;
Size: 20 Address: 0x00000001004071b0

union test_u{
char grass[2];
int tree;
}test;
Size: 4 Address: 0x00000001004071a4

union test_u{
char grass[3];
char tree;
}test;
Size: 3 Address: 0x00000001004071a4

union test_u{
char grass[3];
short tree;
}test;
Size: 4 Address: 0x00000001004071a4

可以看到整个内嵌的数组整体作为一个成员占用了一部分内存区域。

整个共用体的 Size 由最大的共用体成员大小决定。
起始地址与 Size 有关,其规律同共用体。

连载中… by 2021/08/06
预计下次更新 DL: 2021/08/28

标签: char, size, address, 数组, 嵌套, 对齐, 构造类型

相关文章推荐

添加新评论,含*的栏目为必填