提问者:小点点

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

引用C99标准(6.5.3.4):

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

我能从[....计算操作数....]是当传递给 sizeof() 的参数是一个 动态数组 可变长度数组,sizeof() “表现得像”一个函数,而不是一个运算符。

我的理解是对的吗?


共2个答案

匿名用户

它仍然表现为操作员。Cast 也是运算符,并且还计算它的参数,*

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

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

int a[x];
sizeof(a)

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

sizeof(int[x])

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

匿名用户

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

>

  • 好吧,你的意思是“可变长度数组”(VLA)。

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

    sizeof() 的行为类似于“函数,而不是运算符。

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

  • 相关问题