0

これは、ファイルの単語の索引付けに使用される非常に小さな構造です。そのメンバーは、文字列 (単語)、整数の配列 (この単語が見つかった行)、および行配列内の最初の空きセルのインデックスを表す整数です。

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 は私にとって非常に神秘的なものです。提供できるヒントを事前に感謝します。

よろしくお願いします。

4

3 に答える 3

4

これは疑わしいようです:

sizeof(ndex *)

おそらく、ポインタのサイズは必要ありません。構造体のサイズが必要です。だから星を削除します。

于 2013-03-19T00:14:49.263 に答える
2

ここ:

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

いくつかのポインタ(つまり、4バイト* nb_words)にスペースを割り当てています。本当に必要なのは、いくつかの数を割り当てることですndex's

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

また、calloc 0は返されたバッファを初期化しますが、mallocは初期化しません。この回答を参照してください

于 2013-03-19T00:14:45.943 に答える
0
  1. malloc要求されたスペースのみを割り当てます。callocスペースを割り当て、ゼロに初期化します。

  2. あなたの例では、セグメンテーション違反がここで観察されますwords[x].lines[words[x].nLine] = line;。つまり、割り当てが間違っている可能性がありますが、そうではないと思います。より可能性の高いケースは、 にwords[x].nLine評価されませんでした0。この値を印刷して確認してください。これは、プログラムが割り当てられたスペースからメモリにアクセスすることを強制している巨大な数であると思われます。

  3. この部分は他の方が回答されているので飛ばします。

于 2013-03-19T00:19:48.780 に答える