获得0作为分配的阵列的大小,其大小在运行时给出

Getting 0 as the size of stack allocated array whose size is given at runtime

本文关键字:运行时 分配 阵列 获得      更新时间:2023-10-16

我曾经相信,对于堆栈分配的数组,必须在编译时定义其大小。如果阵列的大小未知,我总是使用std::vectornew[]操作员。

但是,最近我遇到了C 代码,即使在编译时不知道数组的大小,也可以编译和执行正常。我已经谈到了一个类似的问题,但是我仍然对此没有明确的看法。

我在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 中无效,为什么还要编译?我如何将3个整数作为ARR1输入,但它的大小为1?

GCC具有一个扩展名,该扩展名允许可变大小的堆栈数组。这是非标准的,据我所知,只能与GCC一起使用,如果您尝试创建大型阵列,将导致堆栈溢出。

sizeof总是在编译时评估,它不知道数组的大小,所以它只是返回1。

坚持使用std::vector用于可变大小数组。