【问题标题】:array declaration in runtime and compile time运行时和编译时的数组声明
【发布时间】:2017-06-29 14:29:10
【问题描述】:

请看以下2个节目片段:

  int a,b; 
  cin>>a>>b;   
  int arr1[a*b];
  int arr2[a];

现在,如果我给出输入值 'a' = 100000 和 'b' = 5,我认为由于内存溢出,程序会显示运行时错误。现在看另一段代码:

  int arr1[500000];
  int arr2[100000];

现在,当我声明与上述代码相同大小的数组时,程序运行正常。为什么会这样?

【问题讨论】:

  • C++ 不支持可变长度数组。
  • @hacks 说了什么。 C 样式数组和std::array 大小必须在编译时知道。你可以使用std::vector或者动态分配一个数组。
  • “我认为由于内存溢出,程序显示运行时错误” - 不要解释错误消息。使用复制和粘贴将其添加到问题中。

标签: c++ arrays variable-length-array


【解决方案1】:

现在,当我提前声明与在运行时声明的大小相同的数组时,程序运行良好。为什么会这样?

因为可变长度数组(又名 VLA)不是有效的标准 C++ 代码。

如果您需要在运行时分配这样的东西,惯用的 c++ 方法是使用 std::vector:

int a,b; 
cin>>a>>b;   
std::vector<int> arr1(a*b);
std::vector<int> arr2(a);

【讨论】:

  • 我这里没有使用可变大小的数组。关键是在两个程序段中两个数组的大小是相同的。但第一段显示错误,但第二段没有。
  • @ShivaVerma “但第一段显示错误” 这实际上是一个 VLA,标准 C++ 不支持。
  • “我这里没有使用可变大小的数组。” - 是的,你是。您很可能使用 g++,它接受 VLA 作为扩展。使用正确的编译器标志,它还会为它们打印一条警告消息。做每个人告诉你的,使用std::vector
  • @ChristianHackl 只是好奇。什么是“正确的编译器标志”?使用-Wall 不会对我使用gcc 5.4.0 产生任何警告
  • @SebTu 你试过--pedantic吗?
猜你喜欢
  • 2015-11-26
  • 2016-03-18
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2011-03-10
相关资源
最近更新 更多