Malloc或calloc

时间:2013-03-19 00:08:25

标签: c malloc calloc

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

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

ndex * words;

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

第一个问题,在分配*单词和/或*行时,malloc(数字*大小)和calloc(数字,大小)之间有什么区别?我应该选择哪个?

第二个问题,我对此进行了研究:

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)循环中初始化行吗?我不明白为什么将它保持为未初始化会阻止写入它,只要它被分配。

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

最好的问候。

3 个答案:

答案 0 :(得分:4)

这看起来很可疑:

sizeof(ndex *)

你可能不想要指针的大小 - 你想要一个结构的大小。所以删除明星。

答案 1 :(得分:2)

下面:

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

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

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

此外,calloc 0初始化返回的缓冲区,而malloc则没有。 See this answer

答案 2 :(得分:0)

  1. malloc仅分配请求的空间。 calloc将分配空间并初始化为零。

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

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