当我第一次使用C时,我很快注意到int array[big number]会导致程序在函数中调用时崩溃。没有那么快,我发现我可以通过定义具有全局作用域的数组(在函数之外)或使用malloc来防止这种情况的发生。
我的问题是:从多大的大小开始,有必要使用上面的方法之一来确保我的程序不会崩溃?
我的意思是,它是安全的使用,例如,int i;
计数器和int chars[256];
小数组,或者我应该只是使用malloc 所有局部变量?
您应该了解在函数中使用int chars[256]
与使用malloc()
之间的区别。
简而言之,前者将整个数组放在堆栈上。后者分配您从堆中请求的内存。一般来说,堆比堆栈大得多,但两者的大小都可以调整。
另一个关键的区别是,在堆栈上分配的变量将在从方法返回后从技术上消失。(哦,如果您继续访问该数组,您的程序可能会像没有消失一样运行,但是危险潜伏着。)使用malloc分配的大块内存将一直保持分配状态,直到显式释放它或程序退出。
您应该使用malloc
进行动态内存分配。对于函数中静态大小的数组(或任何其他对象),如果所需内存太大,您将很快得到分段错误。我不认为可以定义一个"安全限制",它可能是特定于实现的,也有其他因素在起作用,比如当前堆栈和由当前函数的调用者创建的其中的对象。我很想说,只要不涉及递归,任何低于页面大小(通常为4kb)的内容都应该是安全的,但我不认为有这样的保证。
看情况。如果你能保证一行永远不会超过100人……1000个字符,你可以用固定大小的缓冲区。如果你不喜欢,那你就不喜欢。读取x KB的配置文件和x GB的XML文件(没有CR/LF)是有区别的。这取决于.
下一个选择是:你希望你的程序优雅地死亡吗?