C++ 可变大小的对象不能初始化为c++;

C++ 可变大小的对象不能初始化为c++;,c++,C++,我知道以前有人问过这个问题,但我不明白为什么在我的情况下它不起作用 void calc(vector<char> zodis1, vector<char> zodis2, vector<char> zodisAts,int zo1,int zo2,int zoA) { int i,u=0; int zod1[zo1]=0; int zod2[zo2]=0; int zodA[zoA]=0; } void calc(向量zodis1

我知道以前有人问过这个问题,但我不明白为什么在我的情况下它不起作用

void calc(vector<char> zodis1, vector<char> zodis2, vector<char> zodisAts,int zo1,int zo2,int zoA)
{
   int i,u=0;

   int zod1[zo1]=0;
   int zod2[zo2]=0;
   int zodA[zoA]=0; 
}
void calc(向量zodis1、向量zodis2、向量zodisAts、int zo1、int zo2、int zoA)
{
int i,u=0;
int zod1[zo1]=0;
int zod2[zo2]=0;
int zodA[zoA]=0;
}
zod1、zod2和zoA中的所有3个都给了我一个错误:
可变大小的对象可能未初始化为c++

但是编译器在初始化之前应该知道
zo
的含义,因为
cout您只能声明一个大小恒定的
array
,这可以在编译时推导出来
zo1
zo2
zoA
都是变量,只有在运行时才能知道这些值

更详细地说,在堆栈上分配内存时,必须在编译时知道大小。由于数组是方法的本地数组,因此它们将被放置在堆栈上。您可以使用常量值,也可以使用
new
在堆中分配内存,并在使用
delete
完成时取消分配,如

int* zod1 = new int[zo1];
//.... other code


delete[] zod1;
但是您也可以在这里使用
vector
而不是
array
,并且
vector
将负责堆上的分配


作为旁注,您不应该按值传递
vector
,因为整个向量将被复制并作为参数传递,并且在调用方不会看到任何更改。使用
vector&zodis1
来详细说明:变量可以随时更改值,但文件需要知道要分配多少内存。详细说明向量方面的注意事项:这被称为“指针”,本质上不是复制可能的大量内存,而是“指向”数据;这样效率更高,所以在编译整个代码时,我必须知道代码的大小。如果我试图在代码的某部分运行之前给出大小,这是行不通的?@user3102621,您可以,当分配在堆上而不是堆栈上时。谢谢您的回答。在向量方面,我想这会更好,但我不会对向量做任何更改,因此没有必要这样做(除非我认为这样可以节省内存?
vector zod1(zo1)简单得多,因为没有可能失败地删除它。要清楚:在标准C++ +Calp> int ZOD1[ZO1];<代码>是不允许的。然而,许多编译器将其作为扩展提供。根据编译器的错误消息判断,它有一个允许
intzod1[zo1]的扩展但不是允许提供
=0的扩展到那个。