2017-10-04 26 views
1

GSLライブラリを使用してCコードを記述しています。私はGSLライブラリを使って自分のコードに変数を割り振り、解放し、割り振る際に、ある種の矛盾(少なくともCの限られた知識から)に気付いています。最初の割り当てがループ内にあるときは、うまく動作します。別の関数で 変数の割り当て、解放、割り当て

int i; 
for(i=1; i < 101; i++){ 
    gsl_matrix * W = gsl_matrix_alloc(10,10); 
    gsl_matrix_free(W); 
} 

は、私は、ループの前に

int i; 
gsl_matrix * W = gsl_matrix_alloc(10,10); 
for(i=1; i < 101; i++){ 
    gsl_matrix_free(W); 
    gsl_matrix * W = gsl_matrix_alloc(10,10); 
} 

を初期割り当てを持っており、それは動作しません。最後に、私がループのgsl_matrix *を取り出すと、それは動作します。例えば。

int i; 
gsl_matrix * W = gsl_matrix_alloc(10,10); 
for(i=1; i < 101; i++){ 
    gsl_matrix_free(W); 
    W = gsl_matrix_alloc(10,10); 
} 

説明はありますか?ループの内部または外部の最初の割り当ての配置が重要なのはなぜですか?

答えて

1

コンパイラは、変数Wがループ内で再宣言され、変数の外に変数Wが宣言されていないという説明のヒントが表示されます。

2番目のループが機能しない理由は、再割り当てするのではなく、Wを再宣言することです。そのため、最初の反復で行列Wが正しく解放されます。それ以降の反復では、不特定の振る舞いの原因となるぶら下がりポインタが解放されます。

2行目からgsl_matrix *を削除すると、意図したとおりに再割り当てされ、コードが再び機能します。

なお、メモリリークを回避するために解放する必要が最後に割り当てられた行列、にW点:

gsl_matrix * W = gsl_matrix_alloc(10,10); 
for(i=1; i < 101; i++){ 
    gsl_matrix_free(W); 
    W = gsl_matrix_alloc(10,10); // re-assign 
} 
gsl_matrix_free(W); // Avoid memory leaks 
関連する問題