GCC如何实现可变长度数组(VLA)?这些数组是否基本上指向动态分配的存储,例如alloca返回的存储?
我能想到的另一个选择是,这样的数组被分配为函数中的最后一个变量,因此在编译时可以知道变量的偏移量.但是,在编译期间,第二个VLA的偏移量将再次不知道.
#include <iomanip>
#include <iostream>
#include <Windows.h>
using namespace std;
template <class T>
void sort(int n, T a[]){
for(i=0;i<n-1;i++){
for(j=i;j<n;j++){
if(a[i] > a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
void main(){
int size;
cout<<" Please input the amount of numbers you would like to sort"<<endl;
cin>>size;
int Amta[size];
for(int i=0; i<size; i++){
cout<<"Please enter the "<<size+1<< "number";
cin>>Amta[i];
}
Sleep(100000);
}
Run Code Online (Sandbox Code Playgroud)
我试图获取用户想要从用户输入的数量并将其存储在可变大小中.
但是当我初始化时,array Amta[size]我得到以下编译错误:
表达式必须具有恒定值
和
C2057:预期的常量表达式"编译错误.
可能重复:
Stack中的动态数组?
编译器如何处理可变长度数组
我正在辅导的人编写了一些看起来像这样的代码,编译,运行正常,让我感觉像是一个完整的C++初学者:
int main(int argc, char** argv)
{
int Index=0;
cin>>Index;
int Test_array[Index][Index];
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我找到了我的答案,为什么这在这里工作:关于C中的数组
但是,我仍然对如何进行审讯.
我的意思是,代码块的堆栈大小应该提前知道吗?所以肯定,Test_array不能存储在堆栈中......
编译器是否在后台执行new/malloc-delete/free操作以使用堆内存作为数组?
在这种情况下,如果在堆上找不到足够的内存,这样的代码会抛出bad_alloc异常吗?
为什么在C ++中使用可变长度数组是一个坏主意?
因此,例如,此代码:
int i = 0;
std::cin >> i;
int array[i]; // bad?
Run Code Online (Sandbox Code Playgroud)
编辑:这不是重复项,因为重复项询问标准为何选择不将其放入的原因。此问题询问可变长度数组违反了哪些标准规则。