3 回答

TA贡献1841条经验 获得超3个赞
这里有几个不同的作品。
第一个是将数组声明为的区别
int array[n];
和
int* array = malloc(n * sizeof(int));
在第一个版本中,您声明一个具有自动存储持续时间的对象。这意味着只要存在调用它的函数,该数组就会存在。在第二个版本中,您将获得具有动态存储持续时间的内存,这意味着它将一直存在,直到它被显式释放free
。
第二个版本在这里工作的原因是如何编译C的实现细节。通常,C内存分为几个区域,包括堆栈(用于函数调用和局部变量)和堆(用于malloc
ed对象)。堆栈的大小通常比堆小得多; 通常它是8MB的东西。因此,如果您尝试分配一个巨大的数组
int array[n];
然后,您可能会超出堆栈的存储空间,从而导致段错误。另一方面,堆通常具有巨大的大小(例如,系统上空闲的空间),因此malloc
大型对象不会导致内存不足错误。
通常,要注意C中的可变长度数组。它们很容易超过堆栈大小。malloc
除非您知道尺寸很小或者您确实只想要在短时间内使用该阵列,否则请首选。
希望这可以帮助!

TA贡献1802条经验 获得超4个赞
int list[n]
为堆栈n
上的整数分配空间,这通常很小。使用堆栈上的内存比替代方法快得多,但是它非常小并且如果您执行诸如分配大型数组或过度递归之类的操作,则很容易溢出堆栈(即分配太多内存)。您不必手动释放以这种方式分配的内存,它是在阵列超出范围时由编译器完成的。
malloc
另一方面,在堆中分配空间,与堆栈相比通常非常大。您将不得不在堆上分配更大量的内存来耗尽它,但是在堆上分配内存比在堆栈上分配内存要快得多,并且必须free
在完成使用后手动取消分配它。
- 3 回答
- 0 关注
- 1567 浏览
添加回答
举报