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

问题描述

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

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];

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...