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的扩展代码>到那个。