具有可变大小的 C 初始化和非初始化数组

C initialized and non initialized array with variable size

我有接下来的两个代码示例:

const char *val = strchr(ch, ' ');
const int diff = (int)(val - ch);

char arr[diff];

const char *val = strchr(ch, ' ');
const int diff = (int)(val - ch);

char arr[diff] = {0};

第二个生成类似

的错误

error: variable-sized object may not be initialized

这是正确的错误,我明白为什么会这样。

我想知道为什么第一个代码片段没有生成错误?

更新: 同样关于 sizeof(arr) 第一个片段给出了数组的大小,但我认为 sizeof 是一个编译时运算符 (?)

这个定义:

char arr[diff];

创建一个可变长度数组。这样的数组的大小在运行时确定。因此,它可能无法初始化。

在第二种情况下,您正在尝试初始化一个可变长度数组(因为数组的大小没有用整数常量表达式指定;变量声明中限定符 const 的存在diff在数组声明中没有使它成为整型常量表达式)

char arr[diff] = {0};

这对于可变长度数组是不允许的。

来自C标准(6.7.9初始化)

3 The type of the entity to be initialized shall be an array of unknown size or a complete object type that is not a variable length array type

您可以通过以下方式将数组的所有元素设置为零

#include <string.h>

//...

char arr[diff];
memset( arr, 0, diff );

至于运算符 sizeof 然后对于可变长度数组,它在 运行 时计算。

来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)

2 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant