c - C中的可变长度数组并就地初始化

标签 c arrays initialization

<分区>

C99 允许定义具有非常量大小的数组,即用于定义数组的大小可以在运行时更改。解释它的代码片段是,

void dummy_function1(unsigned int length) {

 char arrA[length];  //Allowed
 .
 .
}

但是,它不允许就地初始化它,即

void dummy_function2(unsigned int length) {

 char arrA[length]={0}; //Not Allowed, compiler throws an error
 char arrB[10]={0};     //Allowed
 .
}

我不明白,为什么可变长度数组和恒定长度数组的行为会有所不同。在这两种情况下,调用函数时都会为数组分配内存。

最佳答案

这是因为编译器不知道用多少个零来“填充”剩余的元素。

声明

char arrA[3] = { 0 };

可以很容易地翻译成

char arrA[3] = { 0, 0, 0 };

在编译期间,可变长度声明不能。

由于 C 没有运行时系统,编译器必须添加代码以根据给定长度动态填充零。 C 标准力求最小化,同时为程序员提供最大的能力,因此避免了这样的事情。从 C11 开始,可变长度数组已从标准中删除,并被标记为可选功能。

关于c - C中的可变长度数组并就地初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18854284/

相关文章:

javascript - 在 javascript 中每次 onclick 和循环后追加数组

c - 为什么我的输出是无穷大?你能找出程序中的错误吗?

c - K&R C 中的数组是如何初始化的?

c++ - 在 OpenCV 上组织 channel

c - 十进制转换为基数 2-16(二进制到十六进制)

c - 将 MinGW 程序与 MSVC 静态库链接时发出警告

JavaScript:在空间上划分数组元素并添加到同一个列表

C++ 类模板未定义对函数的引用

c++ - 使用初始化列表中的引用初始化对象成员

android - 如何在 ListView 中标记 View ?