【发布时间】:2016-01-04 06:47:50
【问题描述】:
this answer 的 cmets 部分中的一个论点促使我提出这个问题。
在下面的代码中,bar 指向一个变长数组,所以sizeof 是在运行时而不是编译时确定的。
int foo = 100;
double (*bar)[foo];
争论是关于当操作数是可变长度数组时是否使用sizeof 评估其操作数,使得sizeof(*bar) 在bar 未初始化时的行为未定义。
使用sizeof(*bar) 是否是未定义的行为,因为我正在取消引用未初始化的指针? sizeof 的操作数是在类型是可变长度数组时实际计算的,还是只是确定其类型(sizeof 通常如何工作)?
编辑:每个人似乎都在引用 C11 草案中的 this passage。有谁知道这是否是官方标准中的措辞?
【问题讨论】:
-
@BLUEPIXY 但问题是,如果它是未定义的行为,它仍然可能像您期望的那样运行(即使跨平台和编译器)。
-
@BLUEPIXY 不,不需要,但问题实际上是关于根据标准它是否是未定义的行为。
-
@BLUEPIXY 这可能没有意义,但这就是标准目前所说的。
-
@BLUEPIXY 这个争论实际上是关于标准所说的,而不是实际发生的。
-
5.1.2.3/4: "在抽象机中,所有表达式都按照语义指定的方式进行计算。如果可以推断出表达式的值,则实际实现不需要计算表达式的一部分未使用并且不会产生任何需要的副作用(包括由调用函数或访问 volatile 对象引起的任何副作用)。”
标签: c sizeof variable-length-array