Ну, во-первых, malloc
в вызывающей программе не нужен и вызывает утечку памяти.Попробуйте заменить эти четыре строки на
lda_model *model = quiet_new_lda_model(corpus->num_terms, NTOPICS);
printf ("%f\n", model->alpha); // Segfaults here
Но это вряд ли станет причиной ошибки сегмента.Следующее, что я хотел бы спросить, является ли прототип quiet_new_lda_model
видимым в вызывающей программе?Если нет, ваш указатель может быть усечен до int
.Это можно узнать, изменив все три строки printf
на
printf("%p\n", model);
. Если третья строка printf
печатает значение, отличное от первых двух, вероятно, проблема в отсутствующем прототипе.
РЕДАКТИРОВАТЬ: Еще один способ определить, есть ли у вас отсутствующий прототип, - это просмотреть предупреждающие сообщения, подобные этому:
test.c:4: warning: initialization makes pointer from integer without a cast
Фразировка может отличаться в зависимости от контекста и от того, какой компилятор вы используете.повторное использование.Если вы используете GCC, используйте ключ командной строки -Wall
, чтобы получить более сильный намек:
test.c:4: warning: implicit declaration of function ‘quiet_new_lda_model’
test.c:4: warning: initialization makes pointer from integer without a cast
«Неявное объявление» означает «вы ничего не сказали мне об этой функции, поэтому япредполагается, что он принимает произвольное количество параметров и возвращает int
. "Как вы можете себе представить, это почти всегда неправильно.
(Как правило, если вы используете GCC, вы должны всегда иметь -Wall
в командной строке.)