typedef struct {
/*has 15 pointers*/ // ==> 15 x 4 = 60 bytes ;
uint16_t; // ==> 2 bytes
uint16_t array[];
} dummy_struct;
CASE-A)sizeof(dummy_struct)
返回 64 字节
CASE-B) 如果我尝试打印,
((int) &(((dummy_struct *)(0))->array[0]))
这将打印 62 个字节。
这也打印 62 个字节:((int) &(((dummy_struct *)(0))->array))
我不明白为什么会有价值变化?不应该也sizeof()
返回 62 吗?
如果有这 2 个额外字节的填充,它不应该发生在结构中的灵活长度成员之前吗?如果是这样的话,CASE-B 不应该打印 64 而不是 62 吗?
编辑:
typedef struct {
uint32_t temp;
uint8_t array[][6];
} dummy2;
printf("%d %d\n", sizeof(dummy2), offsetof(dummy2, array)); // PRINTS 4 4
printf("%d \n",((int) &(((dummy2 *)(0))->array[0]))); // PRINTS 4
为什么前面的例子没有发生同样的效果?填充似乎没有在这里发生。那么,上一个示例的可能原因是在灵活尺寸成员之后发生了填充?