c – 将大文件读入数组会导致崩溃
我有一项任务,我需要输入一个7位数的输入(电话号码)并检查它是否在pi的数字中找到. pi的数字存储在提供的空格分隔文本文件中.看起来相当简单:将输入分解为数组,将pi的数字读入数组,并检查是否找到匹配项.长话短说,我让这个程序让我满意.我们提供了文本文档,其中pi的数字为10,100的倍数,依此类推,最多可达100万个数字.我的程序最多可达100,000个数字.但无论出于何种原因,在100万个数字文件中,它会因通用的
Windows错误而崩溃.我没有关于它为什么崩溃并且没有给出错误消息的信息(除了通用的“导致该程序停止工作的问题”消息).
注意到赋值状态的限制我不能使用任何面向对象的代码,除了cin,cout和文件流对象(这个限制是因为我们还没有进入类,他们不希望我们使用函数而不知道他们是如何工作的). 无论如何,我正在寻找有关程序崩溃原因的见解.我对需要它们的每个变量(包括计数器和函数返回)都使用了很长时间,这应该足够了,因为它们可以达到大约20亿,而且这里不应该有任何超过一百万的数字. 谢谢你的帮助.过去几个小时我一直在这里没有成功. const long int numberOfDigits = 1000000; int digitsOfPi[numberOfDigits]; 解决方法int digitsOfPi[numberOfDigits]; 堆栈没有足够的空间来容纳这么大的阵列.堆栈是存储automatic variables(AKA局部变量)的地方.当执行进入函数时,内存将自动分配给局部变量,并在函数返回时释放.由于这种自动内存管理,堆栈很棒,但一个限制是其大小有限. 大对象应该放在堆上.1堆是一个巨大的内存池,您可以随时根据需要动态分配块.堆和堆栈之间的区别在于您负责分配和释放堆内存.它不会自动为您释放. 要在C中分配堆上的内存,请使用 // Allocate memory on the heap. int *digitsOfPi = new int[numberOfDigits]; // Use it. // Then free it. delete[] digitsOfPi; // Or better yet,once you're allowed to use the STL... std::vector<int> digitsOfPi; 但是,更大的问题是为什么需要一次将π的所有数字读入内存.更好的设计虽然比较复杂,但只需要固定的O(1)内存量 – 比如一次7位数. 也可以看看 > What and where are the stack and heap? 1您可以探索编译器的选项以增加堆栈大小,但这不是正确的解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |