加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 将大文件读入数组会导致崩溃

发布时间:2020-12-16 09:41:50 所属栏目:百科 来源:网络整理
导读:我有一项任务,我需要输入一个7位数的输入(电话号码)并检查它是否在pi的数字中找到. pi的数字存储在提供的空格分隔文本文件中.看起来相当简单:将输入分解为数组,将pi的数字读入数组,并检查是否找到匹配项.长话短说,我让这个程序让我满意.我们提供了文本文档,
我有一项任务,我需要输入一个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中分配堆上的内存,请使用new运算符,每个新的具有相应的delete,以便在不再需要时释放内存. (或者在我们的例子中,我们使用new[]delete[],因为我们正在处理数组.)

// 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您可以探索编译器的选项以增加堆栈大小,但这不是正确的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读