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

use*_*891 5 c arrays initialization sizeof variable-length-array

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

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

char arr[diff];
Run Code Online (Sandbox Code Playgroud)

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

char arr[diff] = {0};
Run Code Online (Sandbox Code Playgroud)

第二个产生错误,如

错误:可变大小的对象可能未初始化

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

我想知道为什么第一个代码片段不会产生错误?

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

Vla*_*cow 7

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

char arr[diff] = {0};
Run Code Online (Sandbox Code Playgroud)

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

来自 C 标准(6.7.9 初始化)

3 待初始化实体的类型应为未知大小的数组或非变长数组类型的完整对象类型

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

#include <string.h>

//...

char arr[diff];
memset( arr, 0, diff );
Run Code Online (Sandbox Code Playgroud)

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

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

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