вот очень маленькая структура, используемая для индексирования слов файла. Его членами являются строка (слово), массив целых чисел (строки, в которых это слово находится), и целое число, представляющее индекс первой свободной ячейки в массиве строк.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 очень загадочная вещь, спасибо заранее за любые подсказки, которые вы можете предоставить.
С уважением.
В ваших примерах 'malloc()' и 'calloc()' выделяются одинаковые объемы памяти. –
Для основного различия между malloc и calloc см. Здесь: http://stackoverflow.com/questions/1538420/c-difference-between-malloc-and-calloc – Sebastian