我想在堆栈上创建一个在运行时大小不同的数组。据我所知,这是在C++中总是非法的:堆栈上的非静态大小的数组
void local_array(unsigned int i) {
int arr[i];
}
然而,也可以使用递归栈上动态分配内存。有没有不同的方式来完成这个,而不使用递归?如果不是,那么阻止上述示例被实现的技术限制是什么?
我想在堆栈上创建一个在运行时大小不同的数组。据我所知,这是在C++中总是非法的:堆栈上的非静态大小的数组
void local_array(unsigned int i) {
int arr[i];
}
然而,也可以使用递归栈上动态分配内存。有没有不同的方式来完成这个,而不使用递归?如果不是,那么阻止上述示例被实现的技术限制是什么?
没有技术限制。
你可以在C++ 14中做到这一点,它已经在叮当& gcc最新版本中实现。
void test(int n)
{
int a[n]; //ok now
cout << a[0] << endl; //output a random value on stack!
}
这么晚才被接受的理由是什么? – NmdMystery
除了未定义的不确定数据评估行为(这在评论中得到确认)之外,这是正确的。 – WhozCraig
@NmdMystery原因是,C++得到了向量,没有理由使用栈动态数组。最近它被接受为标准,主要是为了兼容最新的C语言标准C11。由于C没有矢量,因此C有动力,并且它被接受为C11。 – user534498
在2013年4月提出了此功能(N3639 - Runtime-sized arrays with automatic storage duration)并被接受。
现在的C++ 2013-05-15 Committee Draft
从8.3.4部分:
void f(unsigned int n)
{
int a[n]; // type of a is “array of runtime bound of int”
}
@Blacktempel的std ::矢量在堆上分配内存。 – NmdMystery
我不知道你在做什么,我也不确定你是否知道。在B中,除非不在堆栈中(arr!= null),否则堆栈中始终有一个1个元素的数组。 – aalku
我很好奇,为什么你需要使用这样一个复杂的方式有一个动态数组...... – JBL