2016-05-15 35 views
-2

我有这样的代码这实际上是动态内存分配吗?

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

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

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

+7

C或C++?选择一个。 –

+4

根据C++标准,你的代码是不合格的,但在C99中是合法的。这两种语言*非常*不同。 – kfsone

回答

5

这不是正好是动态内存分配,正如通常所理解的术语。

这叫做variable length array。数组的大小在运行时是已知的,因此在运行时分配内存。然而,与动态内存分配库函数(malloc()/calloc())不同,底层内存分配是依赖于编译器的。例如,gcc分配堆栈中的VLA。因此,这种方法的主要区别(与动态内存分配相比)是,VLA驻留在自动存储器中。一旦你离开示波器,它将不再可用。引用C11,章第6.2.4节

对于这样的对象,它具有可变长度数组类型,它的寿命从 直到程序的执行离开 声明的范围扩展的对象的声明。 [...]

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

而AFAIK,C++不支持这个作为标准的组成部分,它可能是一个编译器扩展。

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);