从函数返回的重新分配值会生成seg错误

时间:2011-07-29 00:17:49

标签: c malloc c99

我在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函数与原始调用者之间的事务中可能出现什么问题?

谢谢!

5 个答案:

答案 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'进行更改。也许会有所帮助