获得0作为分配的阵列的大小,其大小在运行时给出
Getting 0 as the size of stack allocated array whose size is given at runtime
我曾经相信,对于堆栈分配的数组,必须在编译时定义其大小。如果阵列的大小未知,我总是使用std::vector
或new[]
操作员。
但是,最近我遇到了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
用于可变大小数组。
相关文章:
- 在运行时为动态分配的内存输入值
- 是否可以在运行时为宏分配地址
- 如何设计运行时分配值枚举?
- 如何修复错误分配C++运行时错误
- 将事件分配给在运行时动态创建的 VCL 控件
- malloc - 运行时内存指针类型分配
- 获得0作为分配的阵列的大小,其大小在运行时给出
- 降低CUDA内核运行时:内核中矩阵的动态内存分配
- 在运行时分配已发布属性的确切时间?
- 在动态内存分配中出现运行时错误
- 动态内存分配如何在运行时分配内存
- 当应用在 Android 设备上运行时,具有 new 的 c++ 对象的内存分配将获得相同的地址
- 有没有更好的方法来处理将标识分配给层次结构中的类以供运行时使用
- 如何在运行时分配组件名称
- 解除分配函数的 A 函数 B 内的运行时内存
- c++类库动态运行时分配
- 尝试将动态数组分配作为函数时出现运行时错误
- 将静态 constexpr 类成员分配给运行时变量
- C++ 矢量内存分配和运行时?
- 创建一个MiniDump,不包括运行时分配的内存范围