运行时C++数组初始化问题

Run time C++ array initialization question

本文关键字:问题 初始化 数组 C++ 运行时      更新时间:2023-10-16

为什么我们不能在全局区域中使用非常量大小初始化数组大小......外部主(( ....

//outside main - global
int val=5;
int arr[val];
int main()
{
}

这会产生错误

7:12: error: array bound is not an integer constant before ']' token
In function 'int main()':

但是如果我在函数的主/主体内移动相同的代码,错误就会消失......

没有错误,它编译得很好...

int main()
{
int val=5;
int arr[val];
}

这也在函数的主体内部工作正常

void fn(int val)
{
int arr[val];
}
int main()
{
fn(5);
}

感到困惑,移动数组大小如何不能仅在 main 外部初始化?

文件范围内的第一个示例

int val=5;
int arr[val];
int main()

在C 和 C++ 上都是非法的。 文件范围内的变量必须在首次使用之前定义(创建(,并继续存在直到程序结束 - 这也意味着,一旦创建,数组就无法调整大小。 对于数组,这意味着(除其他外(它们的维度必须在编译时知道。 使用变量作为数组维度与在编译时知道静态大小的需求相冲突 - 例如,val的值可以在运行时更改(例如在main()中(,这将在创建arr之后。

第二个例子

void fn(int val)
{
int arr[val];
}

在 C 语言中是合法的(从 1999 年开始(,因为arr是自动(非静态(存储持续时间。 它将在进入函数体时创建,并在函数返回时不复存在。 这被称为"可变长度数组"或VLA,因为元素的数量是由运行时变量(val(的值决定的。

在 1999 C 标准之前也不支持 VLA。

在C++,VLA是非法的。 时期。 但是,某些C++编译器确实支持非标准扩展这样的功能。 在C++中,标准容器(例如 出于各种原因,首选std::vector<int>(,包括在运行时调整其大小的能力。

对于函数内部的数组:

您依赖于GCC扩展,如果您添加-pedantic,您将收到以下警告:

警告:ISO C++禁止可变长度数组 'arr' [-WVLA]

所以C++不支持可变长度数组,建议的替代方案是 std::vector。

对于外部数组函数:

您需要在 int 之前添加 const。是的,我知道编译器理论上可以弄清楚 val 永远不会改变,但由于某种原因(没有人想到将其添加到标准中,或者有充分的理由不这样做(您需要添加 const。