0

这是一个非常小的结构,用于索引文件的单词。它的成员是一个字符串(单词)、一个整数数组(这个单词所在的行)和一个表示行数组中第一个空闲单元格索引的整数。

typedef struct {
    wchar_t * word;
    int * lines;
    int nLine;
} ndex;

ndex * words;

我正在尝试使用 malloc 和 realloc 一次分配 (ndex)es nb_words = 128,并且一次分配 (lines) nb_lines = 8。

第一个问题,分配 *words 和/或 *lines 时 malloc(number * size) 和 calloc(number, size) 有什么区别?我应该选择哪个?

第二个问题,我gdbed这个:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400cb0 in add_line (x=43, line=3) at cx17.3.c:124
124     words[x].lines[words[x].nLine] = line;
(gdb) p words[43].nLine 
$30 = 0

换句话说,它始终失败于

words[43].lines[0] = 3;

由于我按 128 分配字,按 8 分配行,没有理由索引对前面的 42 个字起作用并且在这里失败,除非我的分配被搞砸了,是吗?

第三个问题:这是我的分配,它们有什么问题?

words = malloc(sizeof(ndex *) * nb_words);
short i;
for (i = 0; i < nb_words; i++) {
    words[i].lines = malloc(sizeof(int) * nb_lines);
    words[i].nLine = 0;
}

我应该在 for(j) 循环中初始化行吗?我不明白为什么让它未初始化会阻止写入它,只要它已被分配。

这个 C 对我来说是一个非常神秘的东西,提前感谢您提供的任何提示。

最好的祝福。

4

3 回答 3

4

这看起来很可疑:

sizeof(ndex *)

您可能不想要指针的大小 - 您想要结构的大小。所以去掉星星。

于 2013-03-19T00:14:49.263 回答
2

这里:

words = malloc(sizeof(ndex *) * nb_words);

您正在为一些指针分配空间(即 4 个字节 * nb_words)。你真正需要的是分配一些数量ndex's

words = malloc(sizeof(ndex) * nb_words);

此外,calloc 0 初始化返回的缓冲区,而 malloc 没有。看到这个答案

于 2013-03-19T00:14:45.943 回答
0
  1. malloc将仅分配请求的空间。calloc将分配空间并初始化为零。

  2. 在您的示例中,在此处观察到分段错误words[x].lines[words[x].nLine] = line;。可能有两种可能性,即分配错误,我不认为是这种情况。更可能的情况words[x].nLine不会评估为0。请打印此值并检查。我怀疑这是一个巨大的数字,它迫使您的程序从分配的空间中访问内存。

  3. 其他人已经回答了这部分,所以我将跳过它。

于 2013-03-19T00:19:48.780 回答