如下代码:为什么不能用变量名初始化数组呢? 就算加了const也不行。
const int n = nums.size();
bool F[n] = {false};
报错:
error: variable-sized object may not be initialized
如下代码:为什么不能用变量名初始化数组呢? 就算加了const也不行。
const int n = nums.size();
bool F[n] = {false};
报错:
error: variable-sized object may not be initialized
静态语言,编译的时候进行代码段,数据段的分配,都是进行在栈上面的。
执行时内存的动态分配都是new一个实例,落在heap上,这个时候可以根据需要分配。
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
静态编译语言都不能这样声明和初始化数组。
对于C来说,要么用宏定义来实现有意义的静态声明和分配;
或者用 动态分配内存的方式来声明;
如果是C++还可以用new 类型[数量]的方式动态实例化对象数组。
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
试了一下,看样子跟编译器或者语言版本有关啊。
不过假如 b 的 size 是 0,给 a[SIZE]
赋值时如果没有按实际大小对 a 的空间进行扩展,那后面的操作是很危险的,会访问到不该访问的内存。所以这里报错也是应该的。
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
你问题里已经有答案了:
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 一致,即变长数组不允许初始化。