我以前认为对于堆栈分配的数组,必须在编译时定义其大小。如果事先不知道数组的大小,我总是使用std::vector
或new[]
运算符。
但是,最近我遇到了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,怎么办?
答案 0 :(得分:3)
GCC有一个扩展,允许扩展可变大小的堆栈数组。这是非标准的,据我所知仅适用于GCC,如果尝试创建大型数组,则会导致堆栈溢出。
sizeof
总是在编译时求值,它不知道数组的大小,因此只返回1。
坚持对可变大小的数组使用std::vector
。