问题描述
我有接下来的两个代码示例:
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};
第二个产生类似的错误
错误:可能无法初始化可变大小的对象
这是正确的错误,我明白为什么会这样。
我想知道为什么第一个代码片段没有产生错误?
更新: 另外关于 sizeof(arr) 在第一个片段中给出了数组的大小,但我认为 sizeof 是一个编译时运算符 (?)
解决方法
在第二种情况下,您试图初始化一个变长数组(因为数组的大小不是用整数常量表达式指定的;变量 diff 声明中限定符 const
的存在确实不要在数组声明中使其成为整数常量表达式)
char arr[diff] = {0};
这对于变长数组是不允许的。
来自 C 标准(6.7.9 初始化)
3 要初始化的实体的类型应该是一个数组 未知大小或非可变长度的完整对象类型 数组类型
您可以通过以下方式将数组的所有元素设置为零
#include <string.h>
//...
char arr[diff];
memset( arr,diff );
对于运算符 sizeof
那么对于变长数组,它是在运行时计算的。
来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)
2 sizeof 运算符产生其操作数的大小(以字节为单位),即 可以是表达式或类型的括号名称。尺寸是 由操作数的类型决定。结果是一个整数。 如果操作数的类型为变长数组类型,则操作数为 评估; 否则,不评估操作数并且 结果是一个整数常量
,这个定义:
char arr[diff];
创建一个可变长度数组。这种数组的大小在运行时确定。因此,它可能不会被初始化。