C++ 为什么可以';我不能用一个变量来做一个数组吗?
我想从可变大小生成数组,如下所示C++ 为什么可以';我不能用一个变量来做一个数组吗?,c++,arrays,C++,Arrays,我想从可变大小生成数组,如下所示 int buff_size = width*height*3; unsigned char buffer[buff_size]; 但我收到了这样一条错误消息: mfc_test5Dlg.cpp(418): error C2057: expected constant expression 如何制作可变大小数组?您有一个到处躺着。改变 int buff_size; = width*height*3; 到 此外,;如果你真的想要一个长度可变的数组;您必须动态地
int buff_size = width*height*3;
unsigned char buffer[buff_size];
但我收到了这样一条错误消息:
mfc_test5Dlg.cpp(418): error C2057: expected constant expression
如何制作可变大小数组?您有一个
代码>到处躺着。改变
int buff_size; = width*height*3;
到
此外,;如果你真的想要一个长度可变的数组;您必须动态地分配它;您可以通过以下几种方式完成此操作:
C++:新建和删除:
unsigned char* buffer = new unsigned char[buff_size];
...
delete[] buffer;
C:malloc和free:
unsigned char* buffer = (unsigned char*) malloc(buff_size); // or malloc(sizeof(char) * buff_size)
...
free(buffer);
C++中不能有可变大小的数组。如果您完全愿意,您可以动态分配它,但使用
std::vector
几乎总是更好,无论如何,这是一种动态方式:
int buff_size = width*height*3;
unsigned char* buffer = new char[buff_size];
...
delete[] buffer;
您需要避免使用原始指针进行new
和delete
std::size_t const buff_size = width*height*3u;
1) 如有可能,使用std::vector
:
std::vector<char> buffer{buff_size};
3) 手动使用std::unique\u ptr
,否则:
std::unique_ptr<char[]> buffer{new char[buff_size]};
std::unique_ptr buffer{new char[buff_size]};
在现代/安全/惯用C++中,用“代码>向量< /代码>:
std::vector<unsigned char> buffer(buff_size);
std::向量缓冲区(buff\u大小);
所有其他选项都是不安全的(你要么泄漏内存,要么越界),
除了你的排错,考虑到错误似乎不是主要问题,VLA是C99的特性,不是C++特性,不是Visual Studio。你的问题是用C和C++标记的。在C++中,你根本做不到。如果你想得到一个具有dinamic大小的变量或数组,你可以使用“指针”和“内存分配”来实现。做一些搜索,你会发现一些例子。这可能会修复错误,但仍然使用非标准的可变长度数组保留OP。他们应该使用向量
或`新建数组。考虑到错误预期常量表达式
,我认为这不是实际问题。你是对的;我在我的答案中添加了sizeof(char)
将不会产生除1
之外的任何结果。这是无用的。你是对的,但我喜欢保持把大小放在那里的习惯,以避免其他类型的错误。。。我会在回答中加上你的评论。你能解释一下为什么与std::unique\u ptr::operator[]相比,使用std::vector::operator[]
访问数据越界的可能性更小吗?实际上,其他选项自动化程度较低,因此更有可能以错误的方式使用,但这并不意味着它们是不安全的。这些运算符是等效的(忽略了一些实现在调试模式下在vector::operator[]
中进行边界检查的事实)。但是,请考虑<代码> vector::在< /代码>中执行边界检查,并且应该优于<代码>运算符[]/COD>。unique\u ptr
不提供此类功能。选择at
overoperator[]
通常首先需要某种问题敏感度(因此,您不会免费获得安全性…它只是更便宜而已)。手动vector
更易于使用,我普遍认为,如果可能的话,应该优先使用它。
std::unique_ptr<char[]> buffer{new char[buff_size]};
std::vector<unsigned char> buffer(buff_size);