我在C中有一个LDA代码,我正在尝试调试,而且我已经敲了很长时间了。
lda_model *model = NULL;
model = malloc(sizeof(lda_model));
model = quiet_new_lda_model(corpus->num_terms, NTOPICS);
printf ("%f\n", model->alpha); // Segfaults here
如果我们看一下模型创建函数
lda_model* quiet_new_lda_model(int num_terms, int num_topics) {
int i;
lda_model* model;
model = malloc(sizeof(lda_model));
model->num_topics = num_topics;
model->num_terms = num_terms;
model->alpha = 1.0;
printf ("%f\n", model->alpha); // Prints 1.0
model->log_prob_w = malloc(sizeof(double*)*num_topics);
for (i = 0; i < num_topics; i++)
{
model->log_prob_w[i] = malloc(sizeof(double)*num_terms);
memset(model->log_prob_w[i],0,sizeof(double)*num_terms);
}
printf ("%f\n", model->alpha); // Prints 1.0
return(model);
}
quiet_new_lda_model
函数与原始调用者之间的事务中可能出现什么问题?
谢谢!
答案 0 :(得分:5)
好吧,首先,调用者中的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
。)
答案 1 :(得分:1)
这不是解决方案,但是你有内存泄漏;你不应该在第一个代码块中分配模型,因为它是在函数中分配的。
我怀疑真正的根本原因是@Zack建议的 - 你没有原型,所以返回的地址被截断(我假设你是在64位系统上)。
使用
lda_model* quiet_new_lda_model(int, int);
位于第一段代码的顶部。
答案 2 :(得分:0)
首先,malloc
函数中存在quiet_new_lda_model
内存泄漏而没有释放先前声明的资源。您不应该在调用者中执行malloc。第二,lda_model
在哪里/如何定义?头文件是否包含在您调用函数的文件中?
答案 3 :(得分:0)
您最近是否更改了lda_model
的定义?您是否重新编译了更改后使用它的所有源文件?
答案 4 :(得分:0)
修复代码中明显的错误。你的内存泄漏需要修复。再次调试你的代码,在更高的函数中做一个像这样的代码if(model)printf(“%f”,model-&gt; alfa);应该帮助你前进。它无法预测,但有时,堆栈断言可能会产生段错误。
更新:尝试使用'%ld'而非'%f'进行更改。也许会有所帮助