これは、ファイルの単語の索引付けに使用される非常に小さな構造です。そのメンバーは、文字列 (単語)、整数の配列 (この単語が見つかった行)、および行配列内の最初の空きセルのインデックスを表す整数です。
typedef struct {
wchar_t * word;
int * lines;
int nLine;
} ndex;
ndex * words;
malloc と realloc を使用して、一度に (ndex)es nb_words = 128、(lines) nb_lines = 8 を割り当てようとしています。
最初の質問は、単語や行を割り当てるときの malloc(number * size) と calloc(number, size) の違いは何ですか? どちらを選ぶべきですか?
2番目の質問、私はこれを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 の単語に対してインデックス作成が機能し、ここで失敗する理由はありません。
3 番目の質問: これが私の割り当てです。何が問題なのですか?
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 は私にとって非常に神秘的なものです。提供できるヒントを事前に感謝します。
よろしくお願いします。