我真的需要在我的代码中做这样的事情:char str[var+1];但我知道你只能在[]之间放一个常量。所以我只是想问一下,有没有什么方法可以做到我所需要的。
在C++中只能声明一个编译时常数大小的变量。
但是,动态数组可以有一个动态的大小。创建动态数组的最简单方法是使用 std::vector
,如果是字符串,你可以使用 std::string
. 例题。
std::string str(var+1, '\0');
问题原来包括C和C++标签,这个答案是C的
在C。var
对于VLA支持标准(c99和c11中的可选支持)来说,可以是非常数。
以下内容在C语言中是有效的(见.C语言)。https:/godbolt.orgzkUockA)
int var=3;
char str[var+1];
然而VLA在C++标准中并没有定义(见。https:/stackoverflow.coma1887178105104)。 ),也不建议在C语言中使用。
因为VLA通常是在堆栈上分配的,而且如果VLA的值是 var
的分配不受控制。str
可能会失败,而且这种失败的恢复可能很困难。此外,它们可能会鼓励创建高度不安全的代码(如果有人想在堆栈分配的变量上进行指针运算的话)。
有一个倡议是让linux内核代码成为无VLA的代码(见.NET Framework 2.0)。https:/www.phoronix.comscan.php?page=news_item&px=Linux-Kills-The-VLA)。 ):
由于需要在运行时确定数组的大小,使用可变长度数组会给代码增加一些小的运行时开销。
结构内的VLAs不被LLVM Clang编译器所支持,因此对于那些想要在GCC之外构建内核的人来说是一个问题,Clang只支持C99风格的VLAs。
可以说最重要的是围绕着内核的栈使用,VLAs可能会有安全方面的影响。