注册 登录
编程论坛 VC++/MFC

C++中变量、数组和vector对象初始化的问题

wang20080441 发布于 2018-10-30 11:05, 3274 次点击
最近偶然发现,vector与数组的初始化存在区别,对其原理不解,希望高人指点。
环境为VS 2013。
代码一如下:
    int height = 3;
    int width = 4;
    int area = height * width;
    float cell = 1.0 / float(area);

    int map[height][width];
编译结果:
error C2087: “map”: 缺少下标
error C2133: “map”: 未知的大小

代码二如下:
    int height = 3;
    int width = 4;
    int area = height * width;
    float cell = 1.0 / float(area);

    vector< vector <float> > newGrid(height, vector<float>(width, cell));
编译结果:
    成功

    那么问题是,为什么数组不能以已经初始化的变量作为下标,而vector却能以之作为初始化参数呢?难道数组内存的分配和vector对象的内存分配不是在同一时刻进行的吗?如果不是,那么分别是在什么时候呢。
    此外,注意到变量area的初始化同样直接使用了之前的变量。那是否意味着数组内存分配是在所有变量初始化之前?
    希望有经验的同学指点一二。




3 回复
#2
yuccn2018-10-31 23:31
因为  height 和 width 是变量, int map[height][width]; 编译器并不知道你需要多少空间的内存
int *map = new sizeof(int) * height * width; 即可
或者将 height 和 width 改为 宏定义。主要是需要在编译器编译时候,能知道这块空间的大小
#3
wang200804412018-11-01 22:32
回复 2楼 yuccn
恩,我猜是这样的,所以我比较好奇的是,vector <>的空间分配不是在变量定义的时候同时进行的,是么?我以为vector<>的分配是和数组分配同时做的
#4
rjsp2019-03-27 16:41
以下是引用wang20080441在2018-11-1 22:32:20的发言:

恩,我猜是这样的,所以我比较好奇的是,vector <>的空间分配不是在变量定义的时候同时进行的,是么?我以为vector<>的分配是和数组分配同时做的

int map[height][width]; 编译时就需要确定其大小,而 height 和 width 却是个运行时才确定的变量。
vector< vector <float> > 其内部就是一个指针,指向上的数据

简单而言,就是
int map[n];

int* p = new int[n];
的区别。
1