You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何含无名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:10:15