大小需要malloc(或全局赋值)的数组?

时间:2011-09-22 23:00:20

标签: c malloc

在使用C的第一步时,我很快发现int数组[大数]导致我的程序在函数内部调用时崩溃。不是那么快,我发现我可以通过使用全局范围(函数外部)或使用malloc定义数组来防止这种情况发生。

我的问题是:

从哪个大小开始,有必要使用上述方法之一来确保我的程序不会崩溃?

我的意思是,仅使用int i;用于计数器和int chars[256];用于小数组是否安全,或者我应该将malloc用于所有局部变量?< / p>

3 个答案:

答案 0 :(得分:4)

您应该了解函数int chars[256]与使用malloc()之间的区别。

简而言之,前者将整个数组放在堆栈上。后者分配您从堆请求的内存。一般来说,堆比堆栈大得多,但每个堆的大小都可以调整。

另一个关键的区别是,从方法返回后,在堆栈上分配的变量在技术上会消失。 (哦,如果你继续访问那个数组,你的程序可能会好像它没有消失一样,但是有很多危险潜伏着。)用malloc分配的大块内存将保持分配,直到你明确释放它或程序退出

答案 1 :(得分:2)

您应该使用malloc进行动态内存分配。对于函数内的静态大小的数组(或任何其他对象),如果所需的内存很大,则会很快出现分段错误。我不认为可以定义“安全限制”,它可能是特定的实现,也可能是其他因素,例如当前堆栈和调用者为当前函数创建的对象。我很想说任何低于页面大小(通常是4kb)的东西都应该是安全的,只要不涉及递归,但我认为没有这样的保证。

答案 2 :(得分:0)

这取决于。如果你有一定的保证,一行永远不会超过100 ... 1000个字符,你可以使用固定大小的缓冲区。如果你不这样做:你没有。读取整齐的x KB配置文件和x GB XML文件(没有CR / LF)之间存在差异。这取决于。

下一个选择是:您希望您的程序优雅地吗?这只是一种设计选择。