在运行时提供数组大小和动态内存分配之间的区别

时间:2016-12-01 06:34:22

标签: c

在下面的代码中,我在运行时提供了数组大小。

 1:<span>todo:test<span>

请告诉我上面的代码与使用#include <stdio.h> int main() { int i; scanf("%d",&i); int a[i]; } 的代码之间的区别。 我知道数组存储在堆栈上,动态内存(malloc()malloc等)在堆上。 那么我的代码是否与calloc类似?如果没有,请解释。

2 个答案:

答案 0 :(得分:1)

除了你的代码使用VLA:

  • 在C99之前不存在
  • 作为C99
  • 的新功能推出
  • 现在是可选功能,因为C11

不同之处在于自动数组(VLA或静态数组)在超出范围时会自动释放,因此您无法从函数返回它们,而动态分配的数据会持续存在直到它们被明确释放 - 这将在之前发生如果您不想要内存泄漏,则会丢失指向它们的指针。

答案 1 :(得分:0)

Above语句适用于C99,但使用此方法存在局限性:

  

int a[i]是可变长度数组,而不是动态内存   已分配,因此它将存储在STACK而不是HEAP“它存在   在malloc的情况下“因此当有人进入时会出现这种情况   MAX_INT和STACK内存限制非常少(例如:嵌入式   系统)然后可能发生堆栈损坏。