Rav*_*avi 2 c structure sizeof c99 flexible-array-member
如果我们有具有灵活成员数组的结构,例如:-
struct test{
int n;
int b[];
};
Run Code Online (Sandbox Code Playgroud)
然后,即使在 malloc 完成之前,如果我们尝试打印:-
struct test t;
printf("%lu",sizeof(t.b[0]);
Run Code Online (Sandbox Code Playgroud)
这属于未定义行为吗?
C99 是这样描述灵活成员数组的:-
“如果这个数组没有元素,它的行为就好像它有一个元素一样,但如果尝试访问该元素或生成一个超过该元素的指针,则该行为是未定义的。”
因此,访问b[0]是未定义的行为,但它是否也适用于 sizeof 运算符,因为它是编译时运算符并且t.b[0]在运行时永远不会在这里访问?
当我在 gcc 编译器中尝试这个时,我输出了 4 个字节,但如果它属于未定义的行为,那么我们不能认为这个输出是理所当然的,除非 gcc 给出了一些扩展,在这种情况下我不确定。
由于 的参数sizeof没有被评估(除非 VLA),所以你在这里是安全的。
就你而言,t.b[0]是一个完整的类型,int- 具体来说。因此这是明确定义的。事实上,您也可以使用sizeof(t.b[100]),因为它没有被评估,所以索引值并不重要。