Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';我不能用一个变量来做一个数组吗?_C++_Arrays - Fatal编程技术网

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
over
operator[]
通常首先需要某种问题敏感度(因此,您不会免费获得安全性…它只是更便宜而已)。手动
vector
更易于使用,我普遍认为,如果可能的话,应该优先使用它。
std::unique_ptr<char[]> buffer{new char[buff_size]};
std::vector<unsigned char> buffer(buff_size);