【问题标题】:How to rewrite this program of words frequency counter in the text file in c?如何在c的文本文件中重写这个词频计数器程序?
【发布时间】:2016-06-08 13:14:45
【问题描述】:

Here 我们看到了计算文本文件中每个单词出现频率的程序。经过一些小的更正后,它可以完美地处理足够小的文件。我想将它用于大型文本文件,但收到错误“分段错误”。原因是有一个数组的初始化

 char p[1000][512], 

对于大文本来说太小了(如果我理解正确的话,它只能保存1000个单词(通常可能会重合))。如果我尝试放大 p 的维度,我也会得到这个错误(我的计算机上不能有大于 2000*2000 的数组)。

可以修改上面的代码以打开大文本文件吗?如果是,该怎么做?你能写出修改它的代码吗?

【问题讨论】:

  • 唯一正确的答案是“是”。您在网站规则中有具体问题吗?
  • @Olaf:我已经重写了问题。
  • 您似乎将此站点与“gimme teh codez”站点混淆了。对不起,发错地方了。 (是的,我可以重写代码)。
  • 开始修复程序的缩进。

标签: c segmentation-fault full-text-search


【解决方案1】:

考虑使用malloc 直接分配您的数组。

当您将数组声明为 char char p[1000][512] 时,它会在堆栈上分配 512 * 1000(约 512 Kb)。堆栈大小不足以容纳大文件。当你使用 malloc 分配内存时,你要求操作系统在堆中给你一些额外的内存。

所以,你应该这样做,而不是你的代码

typedef char * string_t;
string_t * stringsArray = malloc(sizeof(string_t) * NUM_STRINGS_TO_ALLOCATE);
for (size_t i = 0; i < STRINGS_COUNT; ++i)
   stringsArray[i] = malloc(sizeof(char) * NUM_CHARS_PER_STRING);

使用后别忘了free分配内存,比如:

for (size_t i = 0; i < STRINGS_COUNT; ++i)
   free(stringsArray[i]);
free(stringsArray);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多