我有这段代码
int e;
scanf("%d",&e);
int ar[e];
这是动态分配吗?它看起来就像我可以在运行时分配内存一样。
我用它来获取用户输入的元素数量,然后由用户再次填充。
答案 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中有效。当块结束时,它将自动弹出(解除分配)。
答案 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);