【问题标题】:C initialized and non initialized array with variable size可变大小的 C 初始化和非初始化数组
【发布时间】:2021-06-08 11:52:45
【问题描述】:

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

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

第二个会产生类似的错误

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

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

不知道为什么第一个代码 sn -p 没有产生错误?

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

【问题讨论】:

  • 第一个sn-p没有尝试初始化数组,所以没有错误可以诊断。

标签: arrays c initialization sizeof variable-length-array


【解决方案1】:

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

char arr[diff] = {0};

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

来自 C 标准(6.7.9 初始化)

3 要初始化的实体的类型应该是一个数组 未知大小或不是可变长度的完整对象类型 数组类型

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

#include <string.h>

//...

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

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

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

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

【讨论】:

  • 感谢您的回答。但是这种情况下是内存malloc-ed吗?
  • @user1570891 不,可变长度数组具有自动存储期限。
【解决方案2】:

这个定义:

char arr[diff];

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

【讨论】:

    猜你喜欢
    • 2023-02-23
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多