这是一个非常小的结构,用于索引文件的单词。它的成员是一个字符串(单词)、一个整数数组(这个单词所在的行)和一个表示行数组中第一个空闲单元格索引的整数。
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 对我来说是一个非常神秘的东西,提前感谢您提供的任何提示。
最好的祝福。