为什么不能用变量名初始化数组呢

如下代码:为什么不能用变量名初始化数组呢? 就算加了const也不行。

const int n = nums.size();
bool F[n] = {false};
报错:
error: variable-sized object may not be initialized
阅读 4.6k
4 个回答

你问题里已经有答案了:

variable-sized object may not be initialized

C 跟 C++ 有时候非常不同,所以不要打两个标签 ....


C

C 里一般不会出现 nums.size() 的写法(虽然理论山确实可以往结构体里放函数指针,但是实践上几乎没有人这么搞)。C 里 bool 跟 false 都是宏。

在 C 里, const int 类型的 n 不是一个 constant expression 。所以 bool F[n] 是一个变长数组。而变长数组是不允许初始化的。

C++

C++ 里,const int 类型的 n 可能是一个 constant epxression,前提是它被一个 constant expression 初始化。const 仅用来表示一个运行时的常量,至于它是否是一个编译期的常量,要看它是怎样初始化的,即看初始化它的值是否是一个编译期常量。由于不知道 nums.size() (以及 nums)是如何定义的,这里无法判断 nums.size() 是否是一个 constatnt expression 。因而也无法知道 n 是否是一个 constant expression 。

如果 n 是 constant expression ,并且其值大于或等于 1 ,那么 bool F[n]={false}; 是合法的。

如果不是,由于 C++ 不支持变长数组,bool F[n] 的定义就是非法的。

不过,有一些 C++ 编译器参照 C 的变长数组定义,在 C++ 也实现了变长数组,作为扩展。具体规则就只能参考编译器文档了。不过,通常的实现会与 C 一致,即变长数组不允许初始化。

静态语言,编译的时候进行代码段,数据段的分配,都是进行在栈上面的。

执行时内存的动态分配都是new一个实例,落在heap上,这个时候可以根据需要分配。

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

静态编译语言都不能这样声明和初始化数组。

对于C来说,要么用宏定义来实现有意义的静态声明和分配;
或者用 动态分配内存的方式来声明;
如果是C++还可以用new 类型[数量]的方式动态实例化对象数组。

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

试了一下,看样子跟编译器或者语言版本有关啊。

不过假如 b 的 size 是 0,给 a[SIZE] 赋值时如果没有按实际大小对 a 的空间进行扩展,那后面的操作是很危险的,会访问到不该访问的内存。所以这里报错也是应该的。

image.png


已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题