19

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)的引用:

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

我可以从 [....操作数被评估....] 中理解的是,当传递的参数sizeof()动态数组可变长度数组时,sizeof()“表现得像”一个函数而不是一个运算符

我的理解对吗?

4

2 回答 2

10

它仍然充当运算符。Cast 也是运算符,并且还评估它的参数,*or也是如此&。作为一个操作符是一个句法范畴。这不会改变。

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


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

int a[x];
sizeof(a)

在这种情况下,评估a确实没有区别。但您也可以使用类型作为参数,即

sizeof(int[x])

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

于 2013-02-21T06:31:26.683 回答
7

我的问题是当传递的参数是动态数组时 sizeof() 的行为究竟如何。

  1. 好吧,您的意思是“可变长度数组”(VLA)。

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

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

Nah, it never was a function. The only thing that changes is that if used on VLAs, this operator doesn't yield a compile-time constant, otherwise it does.

于 2013-02-21T06:45:02.983 回答