内存分配前对柔性数组成员首元素使用sizeof是否属未定义行为?
关于柔性数组成员的sizeof操作是否属于未定义行为?
问题背景
定义如下带柔性数组成员的结构体:
struct test{ int n; int b[]; };
在未通过malloc为柔性数组成员分配内存时,执行以下代码:
struct test t; printf("%lu", sizeof(t.b[0]));
请问该操作是否属于未定义行为?
C99标准相关规定
C99标准对柔性数组成员的规定如下:
"If this array would have no elements, it behaves as if it had one element but the behaviour is undefined if any attempt is made to access that element or to generate a pointer one past it."
(中文翻译:如果该数组没有元素,它的行为就像拥有一个元素,但任何尝试访问该元素或生成指向其下一个位置的指针的行为都是未定义的。)
核心分析
- 直接访问
b[0]属于标准明确界定的未定义行为,但sizeof是编译期运算符,运行时并不会实际读取t.b[0]对应的内存空间,它仅用于计算操作数的类型大小。 - 关键疑问在于:标准中提到的“访问元素”这一限制,是否适用于
sizeof这类不实际访问内存的操作?
实际测试结果
在GCC编译器中测试上述代码,输出结果为4字节(与int类型的大小一致)。但如果该操作属于未定义行为,这个结果就不具备跨编译器的通用性,除非GCC有针对该场景的专属扩展支持(目前这一点尚不明确)。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

