首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Malloc或calloc

Malloc或calloc
EN

Stack Overflow用户
提问于 2013-03-19 08:08:25
回答 3查看 243关注 0票数 0

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

代码语言:javascript
复制
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)有什么不同?我应该选择哪一个?

第二个问题,我给出了这个:

代码语言:javascript
复制
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

换句话说,它总是在

代码语言:javascript
复制
words[43].lines[0] = 3;

因为我按128个单词分配,按8行分配,所以索引没有理由对前面的42个单词起作用而在这里失败,除非我的分配搞砸了,是不是?

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

代码语言:javascript
复制
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对我来说是一个非常神秘的东西,提前感谢你能提供的任何提示。

诚挚的问候。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-19 08:14:49

这看起来很可疑:

代码语言:javascript
复制
sizeof(ndex *)

你可能不想要指针的大小--你想要一个结构的大小。所以去掉星号吧。

票数 4
EN

Stack Overflow用户

发布于 2013-03-19 08:14:46

这里:

代码语言:javascript
复制
words = malloc(sizeof(ndex *) * nb_words);

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

代码语言:javascript
复制
words = malloc(sizeof(ndex) * nb_words);

另外,calloc 0初始化返回的缓冲区,而malloc不初始化。See this answer

票数 2
EN

Stack Overflow用户

发布于 2013-03-19 08:19:49

  1. malloc将仅分配请求的空间。calloc将分配空间并初始化为零。
  2. 在您的示例中,在words[x].lines[words[x].nLine] = line;处观察到分段故障。可能有两种可能性,即,分配错误,我不认为是这种情况。更有可能的情况是,words[x].nLine的计算结果不是0。请打印此值并检查。我怀疑这是一个巨大的数字,它迫使你的程序访问分配给你的空间之外的内存。
  3. 其他人已经回答了这一部分,所以我将跳过它。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15489261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档