我们学习C++中会发现,数组的长度不能用变量来表示,如下片断所示:
#include<iostream>
using namespace std;
void main()
{
int length;
cin >> length;
int i = length,array[length];//此处会报错,visual studio2019上面报错如下:
//表达式必须含有常量值,变量length(已声明)的值不可用作常量
while (i)
{
cin >> array[i];
i--;
}
}
为了实现这样的功能,C++里面增添了动态数组,用new和delete实现。
但是,为什么要这么麻烦呢?
难道直接像上面这样写不香么?
我本人的初步想法是内存空间这方面的问题。
求解,,,
局部变量用的都是栈的内存,栈内存有个特点,就是编译的时候就能确定大小,运行时就会自动分配,然后生命周期结束的时候会自动释放。假如数组设计成可以用变量去动态定义的话,这种使用方式就不符合栈内存的特点了,那它就不能使用栈,而得用堆,那你就得手动去释放内存。这样的话数组使用起来就不方便了。我想设计者主要是想提供两种不同的数组实现方式,一种用栈内存,一种用堆内存。想要使用方式简单的话就用栈,想要灵活分配内存的话就用堆
C++是先编译后执行,不是边编译边执行。
局部变量是放在栈区,就是动态存储区,就在编译时分配内存,所以你要指定内存大小,数组的长度只能是常量表达式,不能是变量。#define maxsize 10这种不算变量,因为#define实在编译之前就替换了相关数据,即预编译处理阶段。
全局变量和静态局部变量放在静态存储区,静态存储区是运行期间始终占用固定的内存单元。
其中malloc函数相关,暂时不分配内存,是手动申请内存并手动释放内存。
(可能表述有些不清楚,但是是这么规定的,但是有些编译器比如Devc++又对这种情况不报错,属于特例。。。)
因为在编译连接期间内存要按照你制定的长度给数组分配相应的内存空间,如果是变量的话就没有办法给它分配了
不是明明就可以运气吗,哪里不可以了?
代码如下
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int length;
cin >> length;
int i = length, array[length];//此处会报错,visual studio2019上面报错如下:
//表达式必须含有常量值,变量length(已声明)的值不可用作常量
while (i--) {
cin >> array[i];
}
for (auto &ele : array) cout << ele << ' ';
}