2013-03-19 6 views
0

вот очень маленькая структура, используемая для индексирования слов файла. Его членами являются строка (слово), массив целых чисел (строки, в которых это слово находится), и целое число, представляющее индекс первой свободной ячейки в массиве строк.Malloc или calloc

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

ndex * words; 

Я пытаюсь выделить (NDEX) эс nb_words = 128 в то время, и (линия) nb_lines = 8, в то время, используя таНос и перераспределить.

Первый вопрос, в чем разница между malloc (число * размер) и calloc (число, размер) при распределении * слов и/или * строк? какой я должен выбрать?

Второй вопрос, я 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 предыдущих слов и не сработало здесь, за исключением случаев, когда мое распределение было неудачным, есть ли?

Третий вопрос: вот мои ассигнования, что с ними не так?

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 очень загадочная вещь, спасибо заранее за любые подсказки, которые вы можете предоставить.

С уважением.

+0

В ваших примерах 'malloc()' и 'calloc()' выделяются одинаковые объемы памяти. –

+0

Для основного различия между malloc и calloc см. Здесь: http://stackoverflow.com/questions/1538420/c-difference-between-malloc-and-calloc – Sebastian

ответ

4

Это выглядит подозрительно:

sizeof(ndex *) 

Вы, вероятно, не хотите, размер указателя - вы хотите, размер структуры. Поэтому удалите звезду.

+0

Спасибо, это было. – pouzzler

2

Здесь:

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

Вы выделения места для некоторого количества указателей (т.е. 4 байта * nb_words). Что вам действительно нужно, чтобы выделить некоторое количество ndex's:

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

Кроме того, calloc 0 инициализирует возвращенный буфер, а таНос не делает. See this answer.

0
  1. malloc выделит запрашиваемое пространство. calloc выделит пространство и инициализирует его до нуля.

  2. В вашем примере здесь наблюдается ошибка сегментации words[x].lines[words[x].nLine] = line;. Могут быть две возможности: распределение неправильно, что я не чувствую. Более вероятный случай был бы words[x].nLine не оценивался до 0. Распечатайте это значение и проверьте. Я подозреваю, что это огромное количество, которое заставляет вашу программу получать доступ к памяти из вашего выделенного пространства.

  3. Другие ответили на эту часть, поэтому я пропущу ее.