这实际上是动态内存分配吗?

时间:2016-05-15 17:43:06

标签: c dynamic-memory-allocation variable-length-array

我有这段代码

int e;
scanf("%d",&e);
int ar[e];

这是动态分配吗?它看起来就像我可以在运行时分配内存一样。

我用它来获取用户输入的元素数量,然后由用户再次填充。

3 个答案:

答案 0 :(得分:5)

这不是完全动态内存分配,正如通常所理解的那样。

这称为variable length array。数组大小仅在运行时已知,因此在运行时分配内存。

但是,与动态内存分配库函数(malloc() / calloc())不同,底层内存分配依赖于编译器。例如,gcc在堆栈中分配VLA。

因此,这种方法的主要区别(与动态内存配置相比)是,VLA位于自动存储中。离开示波器后,它将不再可用。引用C11,章节§6.2.4

  

对于具有可变长度数组类型的对象,其生命周期从   对象的声明,直到程序的执行离开了范围   宣言。 [...]

FWIW,这是C99标准中引入的,只是在C11中可选。

AFAIK,C++不支持此作为标准的组成部分,它可以作为编译器扩展提供。

答案 1 :(得分:2)

int ar[e]是堆栈分配的VLA(可变长度数组),在C ++中无效,但在C99中有效。当块结束时,它将自动弹出(解除分配)。

https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

答案 2 :(得分:0)

虽然在这种情况下在运行时分配内存,但它并不完全是动态内存分配。请记住,动态分配的内存应在其使用后释放/释放。

它应该是这样的(在C中)

int e;
scanf("%d", &e);
/*dynamically allocate memory using malloc function*/
int* ar = (int*) malloc(e * sizeof(int));
...
...
...
/* release memory using free() function */
free(ar);