正在获取C99中右值的地址

正在获取C99中右值的地址,c,gcc,c99,undefined-behavior,C,Gcc,C99,Undefined Behavior,以下代码编译并运行: #include <stdio.h> void print(void* x) { printf("%d", *(int*)x); } int main() { print(&((struct { int x, y; }){ .x = 1, .y = 2 })); //outputs 1 return 0; } #包括 作废打印(作废*x) { printf(“%d”,*(int*)x); } int main() { 打印(

以下代码编译并运行:

#include <stdio.h>

void print(void* x)
{
    printf("%d", *(int*)x);
}

int main()
{
    print(&((struct { int x, y; }){ .x = 1, .y = 2 })); //outputs 1
    return 0;
}
#包括
作废打印(作废*x)
{
printf(“%d”,*(int*)x);
}
int main()
{
打印(&((struct{intx,y;}){.x=1.y=2}));//输出1
返回0;
}
为什么编译器允许我获取右值的地址?这是定义的行为吗

(struct{int x,y;}){.x=1,.y=2}
是一个复合文字,并且:

C99§6.5.2.5复合文字 如果类型名称指定了未知大小的数组,则大小由§6.7.8中规定的初始值设定项列表确定,复合文字的类型为完整数组类型的类型。否则(当类型名指定对象类型时),复合文字的类型是由类型名指定的类型。无论哪种情况,结果都是左值。


这些是C99中引入的指定初始值设定项,不是吗?是的。GCC使用
x:1