使用变量大小初始化和非初始化的C语言数组

5

我有下面两个代码示例:

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: 变长对象不可初始化
这是正确的错误提示,我明白为什么会出现这个错误。
我想知道为什么第一个代码片段没有出现这个错误?
更新: 在第一个代码片段中,sizeof(arr)返回数组的大小,但我认为sizeof是一个编译时操作符(?)。

2
第一个片段没有尝试初始化数组,因此没有错误可以诊断。 - John Bode
2个回答

6
在第二种情况下,您正在尝试初始化一个变长数组(因为数组大小未使用整数常量表达式进行指定;在变量diff的声明中出现const限定符并不使它成为数组声明中的整数常量表达式)。
char arr[diff] = {0};

这是不允许使用变长数组的。根据C标准(6.7.9 Initialization),被初始化实体的类型必须是一个未知大小的数组或者不是变长数组类型的完全对象类型。您可以通过以下方式将数组的所有元素设置为零。
#include <string.h>

//...

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

对于运算符sizeof,对于变长数组,其大小在运行时计算。
来自C标准(6.5.3.4 sizeof和alignof运算符):
2. sizeof运算符产生其操作数的大小(以字节为单位),其可以是表达式或类型名括号。大小取决于操作数的类型。结果是一个整数。如果操作数的类型是变长数组类型,则评估该操作数;否则,不对操作数进行评估,并且结果是整数常量。

谢谢你的回答。但是在这种情况下,内存是否使用malloc分配? - user1570891
1
@user1570891 不,变长数组具有自动存储期。 - Vlad from Moscow

4

这个定义:

char arr[diff];

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接