这是一个非常小的结构,用于索引文件的单词。它的成员是一个字符串(单词)、一个整数数组(这个单词所在的行)和一个表示行数组中第一个空闲单元格的索引的整数。
typedef struct {
wchar_t * word;
int * lines;
int nLine;
} ndex;
ndex * words;我正在尝试使用malloc和realloc一次分配(ndex)es nb_words = 128,一次分配(行) nb_lines =8。
第一个问题,在分配*单词和/或*行时,malloc(number * size)和calloc(number,size)有什么不同?我应该选择哪一个?
第二个问题,我给出了这个:
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对我来说是一个非常神秘的东西,提前感谢你能提供的任何提示。
诚挚的问候。
发布于 2013-03-19 08:14:49
这看起来很可疑:
sizeof(ndex *)你可能不想要指针的大小--你想要一个结构的大小。所以去掉星号吧。
发布于 2013-03-19 08:14:46
这里:
words = malloc(sizeof(ndex *) * nb_words);您正在为一定数量的指针分配空间(即4字节* nb_words)。您真正需要的是分配一定数量的ndex's
words = malloc(sizeof(ndex) * nb_words);另外,calloc 0初始化返回的缓冲区,而malloc不初始化。See this answer。
发布于 2013-03-19 08:19:49
malloc将仅分配请求的空间。calloc将分配空间并初始化为零。words[x].lines[words[x].nLine] = line;处观察到分段故障。可能有两种可能性,即,分配错误,我不认为是这种情况。更有可能的情况是,words[x].nLine的计算结果不是0。请打印此值并检查。我怀疑这是一个巨大的数字,它迫使你的程序访问分配给你的空间之外的内存。https://stackoverflow.com/questions/15489261
复制相似问题