簡體   English   中英

Malloc或Calloc

[英]Malloc or calloc

這是一個非常小的結構,用於索引文件的單詞。 它的成員是一個字符串(單詞),一個整數數組(在這個單詞所在的行)以及一個整數,該整數表示lines數組中第一個空閑單元的索引。

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

ndex * words;

我正在嘗試使用malloc和realloc一次分配(ndex)es nb_words = 128,一次(行)nb_lines = 8。

第一個問題,分配* words和/或* lines時,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對我來說是一件非常神秘的事情,在此先感謝您提供的任何提示。

最好的祝福。

這看起來很可疑:

sizeof(ndex *)

您可能不想要指針的大小-您想要結構的大小。 因此,刪除星星。

這里:

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

您正在為一定數量的指針分配空間(即4個字節* nb_words )。 您真正需要的是分配一些ndex's

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

另外,calloc 0初始化返回的緩沖區,而malloc不初始化。 看到這個答案

  1. malloc將僅分配請求的空間。 calloc將分配空間並初始化為零。

  2. 在您的示例中,觀察到分段錯誤,在這里words[x].lines[words[x].nLine] = line; 可能有2種可能性,即分配錯誤,我認為情況並非如此。 更可能的情況是words[x].nLine求值結果不是0 請打印此值並檢查。 我懷疑這是一個巨大的數字,迫使您的程序無法訪問分配的空間中的內存。

  3. 其他人已經回答了這一部分,因此我將跳過它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM