【问题标题】:variable-sized object may not be initialized c++可变大小的对象可能未初始化 C++
【发布时间】:2014-05-20 04:34:38
【问题描述】:

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

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; 
}

zod1、zod2、zoA 的所有 3 个都给我错误:variable-sized object may not be initialized c++ 但是编译器应该在初始化之前知道zo的含义,因为cout&lt;&lt;zo1;起作用并打印出含义

那么问题出在哪里?

【问题讨论】:

  • 要明确:在标准 C++ 中 int zod1[zo1]; 是不允许的。但是,许多编译器将其作为扩展提供。从编译器的错误消息来看,它有一个扩展名允许int zod1[zo1];,但没有一个扩展名允许提供=0;

标签: c++


【解决方案1】:

你可以声明一个array,只有常量大小,可以在编译时推导出来。 zo1,zo2zoA 是变量,只有在运行时才能知道其值。

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

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


delete[] zod1;

但您也可以在此处使用vector 代替arrayvector 将负责堆上的分配。

附带说明,您不应该通过值传递vector,因为整个向量将被复制并作为参数传递,并且在调用方不会看到任何更改。请改用vector&lt;char&gt;&amp; zodis1

【讨论】:

  • 详细说明:变量可以随时更改值,但文件需要知道要分配多少内存。并详细说明向量方面的说明:这称为“指针”,本质上不是复制可能大量的内存,它只是“指向”数据;这样效率更高。
  • 所以在编译整个代码时我必须知道大小。如果我尝试在部分代码正在运行之前给出大小,它不会起作用?
  • @user3102621,当分配在堆上时,你可以,而不是在堆栈上。
  • 感谢您的回答。在向量方面,我想这会更好,但我不会对向量进行任何更改,所以没有必要这样做(除非我认为它会节省内存?)
  • vector&lt;int&gt; zod1(zo1); 要简单得多,因为以后删除它是不可能的。
猜你喜欢
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多