我有这样的代码这实际上是动态内存分配吗?
int e;
scanf("%d",&e);
int ar[e];
这是动态分配?它看起来像是我可以在运行时分配内存。
我用它从用户获取输入的元素数量,然后再由用户填充它。
我有这样的代码这实际上是动态内存分配吗?
int e;
scanf("%d",&e);
int ar[e];
这是动态分配?它看起来像是我可以在运行时分配内存。
我用它从用户获取输入的元素数量,然后再由用户填充它。
这不是正好是动态内存分配,正如通常所理解的术语。
这叫做variable length array。数组的大小在运行时是已知的,因此在运行时分配内存。然而,与动态内存分配库函数(malloc()
/calloc()
)不同,底层内存分配是依赖于编译器的。例如,gcc
分配堆栈中的VLA。因此,这种方法的主要区别(与动态内存分配相比)是,VLA驻留在自动存储器中。一旦你离开示波器,它将不再可用。引用C11
,章第6.2.4节
对于这样的对象,它具有可变长度数组类型,它的寿命从 直到程序的执行离开 声明的范围扩展的对象的声明。 [...]
FWIW,这是在C99
标准中引入的,只有在C11
中才可选。
而AFAIK,C++
不支持这个作为标准的组成部分,它可能是一个编译器扩展。
int ar[e]
是堆栈分配的VLA(可变长度数组),它在C++中无效,但在C99中有效。块结束时,它将自动弹出(释放)。
虽然内存在这种情况下,在运行时分配的,它是不完全动态内存分配。请记住,动态分配的内存应该在其使用后释放/释放。
这应该是这样的(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);
C或C++?选择一个。 –
根据C++标准,你的代码是不合格的,但在C99中是合法的。这两种语言*非常*不同。 – kfsone