在内存分配之前对灵活成员数组的第一个元素使用 sizeof 是未定义行为?

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 给出了一些扩展,在这种情况下我不确定。

Sou*_*osh 5

由于 的参数sizeof没有被评估(除非 VLA),所以你在这里是安全的。

就你而言,t.b[0]是一个完整的类型,int- 具体来说。因此这是明确定义的。事实上,您也可以使用sizeof(t.b[100]),因为它没有被评估,所以索引值并不重要。