sizeof在可变长度数组上的行为(仅限C)

我的问题是当传递的参数是动态数组变量长度数组时, sizeof()行为如何。

我们来看一个例子:

 int fun(int num_of_chars) { char name_arr[num_of_chars] = {0}; /* Do something*/ return sizeof(name_arr); } 

在这个例子中,很明显返回值不是编译时常量。 因为大小取决于num_of_chars运行num_of_chars

引用C99标准(6.5.3.4):

sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。 大小由操作数的类型确定。 结果是整数。 如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量。

我从[….操作数被评估….]中可以理解的是,当为sizeof()传递的参数是动态数组变量长度数组时, sizeof() ‘的行为类似于’一个函数,而不是一个函数运营商

我的理解是对的吗?

它仍然表现为运营商。 Cast也是运算符,也会评估它的参数, *&也是如此。 作为运算符是句法类别。 这不会改变。

重要的区别在于它表现为表达式,而在其他情况下它表现为常量


更新:我在下面评论说我不明白为什么评估有所不同,但现在我意识到有两种方法可以用可变长度数组编写sizeof。 您可以传递声明为变量lenght数组的变量:

 int a[x]; sizeof(a) 

在这种情况下,评估确实没有任何区别。 但是你也可以使用一个类型作为参数

 sizeof(int[x]) 

在这种情况下,结果是x * sizeof(int)并且必须计算x 。 我想这就是规范提到它的原因。

我的问题是当传递的参数是一个动态数组时,sizeof()的行为是多少。

  1. 好吧,你的意思是“可变长度arrays”(VLA)。

  2. 它的行为几乎完全相同:它以字节为单位返回数组的大小。

sizeof()’表现得像’一个函数,而不是一个运算符。

不,它从来都不是一个function。 唯一改变的是,如果在VLA上使用,则此运算符不会产生编译时常量,否则会产生。