为何含无名char数组的inotify_event结构体与inotify_event_no_name大小相同?
问题:为何包含柔性数组的结构体
inotify_event与不含它的inotify_event_no_name的sizeof结果相同? 测试代码
#include <iostream> struct inotify_event { int wd; uint32_t mask; uint32_t cookie; uint32_t len; char name[]; }; struct inotify_event_no_name { int wd; uint32_t mask; uint32_t cookie; uint32_t len; }; int main() { std::cout << "sizeof(int): " << sizeof(int) << std::endl; std::cout << "sizeof(inotify_event): " << sizeof(inotify_event) << std::endl; std::cout << "sizeof(inotify_event_no_name): " << sizeof(inotify_event_no_name) << std::endl; return 0; }
输出结果
sizeof(int): 4 sizeof(inotify_event): 16 sizeof(inotify_event_no_name): 16
已知len字段统计name中的所有字节(包括空字节),因此每个inotify_event结构体的实际长度为sizeof(struct inotify_event)+len。请问为何inotify_event与inotify_event_no_name的sizeof结果相同?
解答
这是因为char name[]是柔性数组(flexible array member),C++和C标准都明确规定:计算包含柔性数组的结构体大小时,不会将柔性数组的尺寸计入sizeof的结果中——sizeof只会计算结构体里除柔性数组外所有成员的总大小,再加上满足内存对齐要求的填充字节。
结合你的例子来看:
int wd占4字节,三个uint32_t类型的成员(mask、cookie、len)各占4字节,加起来是4 + 4*3 = 16字节。- 两个结构体的非柔性成员完全一致,内存对齐的要求也相同,所以它们的
sizeof结果自然相等。
柔性数组的设计初衷就是让结构体能够在运行时动态扩展内存:你可以通过分配sizeof(inotify_event) + len大小的内存,来同时容纳结构体的固定成员和name的内容,而sizeof仅反映结构体固定部分的大小。
内容的提问来源于stack exchange,提问作者q0987
相关产品推荐
相关产品推荐

