为动态变化的多维数组重新分配空间?

时间:2015-04-19 18:18:46

标签: c multidimensional-array malloc

我只是想知道我究竟是怎么回事。我知道我应该使用malloc,但我仍然不确定如何解决这个问题。

编辑:我意识到我实际想要使用的功能是realloc

我想分配的每一行都会有不断变化的大小,我还想在程序代码进行过程中添加更多行。

如果您想知道原因,我正在开展一个项目,其中我读了一个.txt文件然后打印出来,出现次数最多的单词以及数字外表。

3 个答案:

答案 0 :(得分:2)

对于想要读取行文件的情况,我建议您使用行的链接列表而不是行数组,因为您可以通过保持指向最后一个元素的指针轻松追加到链接列表(自己解决这个问题)。如果愿意,您可以稍后将该链接列表转换为数组。

您还可以尝试计算文件的长度,并一次性为整个文件分配所有空间(然后可能一次读取整个文件),这样您就不必重新分配每时每刻。再次,自己解决细节。

对于您的特定问题,您实际上根本不需要将文件读入内存!您可以将单词与trie或类似数据结构中的出现次数一起保存,并保持到目前为止具有最高计数的单词的链接。这并不是很复杂,但细节超出了这个问题的范围。

答案 1 :(得分:0)

根据程序的动态行为,我有几个想法。

首先,您可以考虑链接列表而不是数组。这将使删除和添加元素变得非常容易。如果要减少行数,首先必须删除行中的所有元素,然后删除行元素本身。

使用链接列表的2D矩阵:

[[_]] -> [[_]] -> [[_]] -> [[_]] -> [[_]]
  |        |        |        |        |
  v        v        v        v        v
 [_]      [_]      [_]      [_]      [_]
  |        |        |        |        |
  v        v        v        v        v
 [_]      [_]      [_]      [_]      [_]
  |        |        |        |        |
  v        v        v        v        v
 [_]      [_]      [_]      [_]      [_]

其次,如果您通常只有 ADD 元素,那么您的行可以类似地表示C ++向量。使用内部变量创建每个行/行以跟踪填充级别。如果结构变满,则重新分配更大的尺寸(有一个说“尺寸加倍”的来源是一种很好的通用方法)。

可以用来代替链表的数据结构(至少在一行内):

struct d_array(){
    int fillevel, size;
    void* memory;
}

这个数据结构需要在每次插入之前检查一些函数,如果它已满并根据需要重新分配。缩小比较困难,你可以尝试定期清理。通常,您不希望过于急切地缩小,因为稍后可能需要再次使用该空间(如果您的行再次增长)。

答案 2 :(得分:0)

  

如果你想知道为什么,我正在做一个项目,我   读取.txt文件,然后打印出具有最高编号的单词   外观,以及出场次数。

您不需要多维数组。文本按顺序存储,新行使用\n字符表示。

但是你还需要一些像地图一样的关联容器,以便在解析文本文件时在其中存储唯一的单词。

在“伪代码”中:

for the entire text
    parse a word
        if word is not in the map insert it with count one
        else find and increment the word's count
find the word with higher count value

不幸的是,C没有附带地图容器,您必须自己find one或自己写一个,这可能仍然不在您的编程能力范围内。

对于单词的解析,您可以创建一个字符数组,表示有效的文本字符,如AaBbCcDd...,并为文本的每个字符检查它是否包含在该数组中。如果它被包含而前一个不是(或者这是第一个字符)你注册了一个单词开头的索引,如果它没有被包含,而之前你有一个是,那么你标记单词的结尾,从索引范围中提取单词并继续在地图中更新它。依此类推,直到你到达文本末尾。

最后但并非最不重要的是,地图实际上是可选的。您也可以将单词条目存储为常规数组中char * wordint count的结构,但在很多单词的情况下,查找性能可能会很差,因为它会涉及大量的字符串比较,而地图将散列字符串并查找整数而不是字符串。