考虑以下示例:
typedef struct test_flex_arr{
size_t sz;
struct {
int i;
const char *path;
} info[];
} tfa;
int main(void){
size_t sz = 100;
tfa *ptr = malloc(sizeof *ptr + sizeof (*((tfa*) NULL)).info[sz]);
ptr->info[99].i = 10;
printf("%d\n", ptr->info[99].i); //prints 10
}
我预计这个程序会崩溃,但它运行得很好。如指定6.5.3.4(p2)
:
运算符产生其
sizeof
操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果为整数常量
的操作数的类型sizeof ((*((tfa*) NULL)).info)[sz]
是可变长度数组,因此应评估操作数。但是对操作数的评估意味着取消引用NULL
,我预计会导致崩溃。
代码的行为是否定义良好?