c - 如何用c语言重写文本文件中的词频计数器程序?

标签 c segmentation-fault full-text-search

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

 char p[1000][512], 

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

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

最佳答案

考虑使用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);

使用后不要忘记释放分配的内存,例如:

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

关于c - 如何用c语言重写文本文件中的词频计数器程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37703570/

相关文章:

full-text-search - SPHINX字段搜索运算符问题

c - 为什么在 vulkan.h 中,不可分派(dispatch)的对象总是类型定义为 64 位?

c++ - 在 FastCGI 和 Octave 中重新定义标准输出

c - mktime() 段错误

c++ - 使用我自己的 Point 类自定义 CGAL 内核

c++ - 为什么这个内存代码会出现段错误?

c - 按值返回结构每次都会给出相同的错误答案

c - 如何在 C 中生成对数间隔数组

sql-server - 全文搜索精确匹配 - 在二进制文件中

mysql - 全文 mysql 搜索不起作用