我的问题是具体如何sizeof()
当传递的参数是动态数组可变长度数组时的行为。
让我们考虑一个例子:
int fun(int num_of_chars)
{
char name_arr[num_of_chars] = {0};
/* Do something*/
return sizeof(name_arr);
}
在此示例中,很明显返回值不是编译时常量。因为大小取决于运行时值num_of_chars
.
引用C99标准(6.5.3.4):
The sizeof
运算符产生其操作数的大小(以字节为单位),这可能是
表达式或带括号的类型名称。尺寸由下式确定
操作数的类型。结果是一个整数。如果操作数的类型是
变长数组类型,对操作数进行求值;否则,操作数是
未计算,结果是整数常量。
我从 [....操作数被求值...] 中可以理解的是,当参数传递给sizeof()
是一个动态数组可变长度数组,sizeof()
“表现得像”函数而不是运算符.
我的理解对吗?
它仍然表现为一个操作符。 Cast 也是运算符,也评估它的参数,也是如此*
or &
。作为一个运算符是一个语法范畴。这并没有改变。
重要的区别在于它的行为如下表达而在其他情况下,它的行为如下constant.
更新:我在下面评论说我不明白为什么评估会有所不同,但现在我意识到有two可以用可变长度数组编写 sizeof 的方法。您可以传递声明为可变长度数组的变量:
int a[x];
sizeof(a)
在这种情况下评估a
确实没有什么区别。但您也可以使用type作为论点,这将是
sizeof(int[x])
在这种情况下,结果是x * sizeof(int)
and x
必须进行评估。我想这就是规范中提到它的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)