获得0作为堆栈分配数组的大小,其大小在运行时给出

时间:2019-05-11 05:52:51

标签: c++

我以前认为对于堆栈分配的数组,必须在编译时定义其大小。如果事先不知道数组的大小,我总是使用std::vectornew[]运算符。

但是,最近我遇到了C ++代码,即使在编译时不知道数组的大小,该代码也可以很好地编译和执行。我在this上也遇到了类似的问题,但是我仍然不清楚。

我在cpp.sh在线尝试了以下代码。我不明白我得到的输出。

代码

#include <iostream>
using namespace std;

int main()
{
  int n;
  cout<<endl<<"Enter the size of arr1: ";
  cin>>n;
  int arr1[n];

  cout<<endl<<"Enter the elements of arr1 below"<<endl;

  for(int i=0;i<n;++i)
  cin>>arr1[i];

  cout<<endl<<"Size of arr1: "<<sizeof(arr1)/sizeof(arr1[0]);  
  cout<<endl<<"sizeof(arr1): "<<sizeof(arr1);
  cout<<endl<<"sizeof(arr1[0]): "<<sizeof(arr1[0])<<endl;

  int arr2[3];
  cout<<endl<<"Size of arr2: "<<sizeof(arr2)/sizeof(arr2[0]);
  cout<<endl<<"sizeof(arr2): "<<sizeof(arr2);
  cout<<endl<<"sizeof(arr2[0]): "<<sizeof(arr2[0])<<endl;
  return 0;

}

输出

Enter the size of arr1: 3

Enter the elements of arr1 below
1 3 5

Size of arr1: 0
sizeof(arr1): 1
sizeof(arr1[0]): 4

Size of arr2: 3
sizeof(arr2): 12
sizeof(arr2[0]): 4

如果它在C ++中无效,为什么还要编译?可以在arr1中将3个整数用作输入,但是它的大小是1,怎么办?

1 个答案:

答案 0 :(得分:3)

GCC有一个扩展,允许扩展可变大小的堆栈数组。这是非标准的,据我所知仅适用于GCC,如果尝试创建大型数组,则会导致堆栈溢出。

sizeof总是在编译时求值,它不知道数组的大小,因此只返回1。

坚持对可变大小的数组使用std::vector