2011-07-29 14 views
0

私はデバッグしようとしているCのLDAコードを持っており、かなり長時間頭を叩いています。関数から返された値を再割り当てすると、segのエラーが発生する

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 

我々はquiet_new_lda_model機能と、元の発信者間の取引で問題になる可能性がどのようなモデル作成機能

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); 
} 

を見れば?

ありがとうございます!

+2

ない故障のためのmalloc()をチェックするファン役立ちますchange..Maybeのための「%のF」とは対照的に「%ldの」を使用してみてください、私は...見 – Josh

+0

コメントアウトモデル - > log_prog_wを扱うコードがまだクラッシュするかどうかを確認してください – James

答えて

5

まず、発信者のmallocは不要で、メモリリークの原因となっています。それらの4行を置き換えてみてください

lda_model *model = quiet_new_lda_model(corpus->num_terms, NTOPICS); 
printf ("%f\n", model->alpha); // Segfaults here 

しかし、それはsegfaultの原因となることはほとんどありません。私が尋ねる次のことは、呼び出し元にquiet_new_lda_modelのプロトタイプが表示されていることですか?そうでない場合は、ポインタがintに切り捨てられている可能性があります。あなたは第三printfが不足しているプロトタイプが問題である可能性が高い、最初の二つは異なる値を出力した場合

printf("%p\n", model); 

を読み取るためにprintfラインの3つのすべてを変更することで見つけることができます。

EDIT:あなたが不足しているプロトタイプを持っている場合伝えるための別の方法は、この1のような警告メッセージを探すことです:

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を持っている必要があります。)すべての

+0

あなたは正しいです。 quent_new_lda_modelの呼び出し直後のprintf( "%p \ n"、model)は異なる番号です。不足しているプロトタイプを修正するにはどうすればよいですか?それは添付のヘッダーファイルで私が修正するものですか? – Rio

+0

これが問題であることを確認するには、次のように入力します。lda_model * quiet_new_lda_model(int、int);コードファイルの先頭に表示されます(最初のブロック)。 –

+0

'quiet_new_lda_model'関数を書いたのですか、それともあなたが使っているライブラリのものですか?ライブラリからのものであれば、そのプロトタイプを宣言するヘッダーファイルが既に存在するはずです。 #そのヘッダをインクルードします。それがあなたのコードなら、プロトタイプでヘッダファイルを作るか、すでに持っているヘッダにプロトタイプを追加する必要があります。 – zwol

1

これは解決策ではありませんが、メモリリークがあります。関数に割り当てられているため、最初のコードブロックにモデルを割り当てるべきではありません。

@Zackが示唆しているのは本当の根本原因だと思われます。プロトタイプがないので、返されるアドレスは切り詰められています(私はあなたが64ビットシステムであると仮定しています)。コードの最初のブロックの上部に

使用

lda_model* quiet_new_lda_model(int, int); 

0

まず、なしquiet_new_lda_model機能でmallocをやって、メモリリークがあります以前に請求されたリソースを解放する。呼び出し元でmallocを実行する必要はありません。次に、lda_modelはどこに/どのように定義されていますか?ヘッダーファイルは、関数を呼び出すファイルに含まれていますか?

0

最近lda_modelの定義を変更しましたか?変更後にそれを使用するすべてのソースファイルを再コンパイルしましたか?

0

コードの明白なバグを修正しました。あなたは修正が必要なメモリリークがあります。 2番目に、あなたのコードを再度デバッグするために、より高い関数で次のようなコードを実行します。if(model)printf( "%f"、model-> alfa);あなたが前進するのを助けなければならない。予測はできませんが、スタックアサーションがセグメンテーションを作成することがあります。

更新:それは

関連する問題