我试图理解C ++中静态数组和动态数组之间的区别,并且我想不出静态数组无法解决问题的情况。
我正在考虑将以这种方式声明的静态数组:
int N=10;
int arr[N];`
我读过here,说静态数组和动态数组之间的主要区别在于在编译过程中分配了一个静态数组,因此在编译时需要知道N 。
但是,this解释了以这种方式声明的数组也可以是可变长度数组:
在C99中添加了可变长度数组-它们的行为与固定长度数组相似,只是它们的大小是在运行时确定的; N不必是编译时常量表达式:
实际上,即使n
仅在运行时才知道,以下c ++代码仍在工作:
int n =-1;
std::cin>>n;
int arr[n];
//Let the user fill the array
for(int i=0; i<n;i++){
std::cin>>arr[i];
}
//Display array
for(int i=0; i<n;i++){
std::cout<<i<<" "<<arr[i]<<std::endl;
}
所以我想一个代码示例是这样定义的静态数组不起作用,并且需要使用动态数组?
答案 0 :(得分:2)
该代码不适用于所有编译器,因为variable length arrays aren't part of C++。从ISO C99开始,它们是C的一部分,某些编译器将允许使用C ++的VLA,但这不是便携式解决方案。例如,GCC允许VLA,但警告用户(-Wno-vla
)。
在幕后,VLA还是动态的,因为编译器无法保留适当数量的堆栈内存,因为它不知道数组的大小。代替VLA,std::vector
可用于在作用域末尾释放的动态内存。