具有可变大小的 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
我有接下来的两个代码示例:
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