2016-07-01 14 views
0

私はCで2D配列を作成しています。私はそれを正しく解放していますか?すべてのmalloc()についてはCで2Dのmallocされた配列を解放するにはどうすればよいですか?

// create 
int n = 3; 
int (*X)[n] = malloc(sizeof(int[n][n])); 

// set to 0 
for(int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++) { 
     X[i][j] = 0; 
    } 
} 

// is this all I need? 
free(X); 
+3

ポインタとポインタの表記のための配列表記を指すのではなく、あなたに答えを与えることについて心配しているのは、このコードがたくさんあることです(よくありませんが、0以上です) ;あなたがこのすべてが何を意味するのか分からなければ、この場合あなたを助けて、道を傷つけるでしょう。構文が何を意味するのか分からなければ、私たちの答えはあなたに何かを意味するために本当に深くなければなりません。 –

+3

'malloc()'への呼び出し回数をカウントします。 'free()'への呼び出し回数を数えます。あなたが何か愚かなことをしていない限り( 'malloc()'によって返されないものを解放するなど)、割り当てと解放の数が同じであれば、すべてをリリースしました。可能であれば、あなたは['valgrind'](http://valgrind.org/)を調べるべきです。それはこれよりも複雑な問題の人生を救う人です。 –

+0

私はそれが公正だと思います、この特定の構文の説明に私を指摘できますか?最初の部分は、私が思う構造体へのポインタを参照解除するために見た - >私が見た他のバージョンとほとんど同じです。 – Austin

答えて

3

mallocごとにfreeを1回呼び出す必要があります。あなたのコードにはmallocfree(同じアドレスを持つ)がありますので正しいです。

0

、マッチングfree()がなければなりません。したがって、ループ内でmalloc()を呼び出す場合は、後でfree()を何度も呼び出す同様のループが存在する必要があります。あなたのコードはmalloc()と対応するものがあります。free()ですので、必要なものはすべてfree dです。後で解放するために、その後

int **arr = malloc(sizeof (int *) * num_rows); 

for (i = 0; i < num_rows; ++i) 
     arr[i] = malloc(sizeof (int) * num_cols); 
/* 
    * Using `sizeof *arr` and `sizeof **arr` 
    * respectively would have been more safe, 
    * but for the purpose of this example, I think 
    * using `int *` and `int` is simpler to 
    * understand. 
    */ 

for (i = 0; i < num_rows; ++i) 
     free(arr[i]); 

free(arr); 

これは、外形寸法ホールドを作る

私は2次元配列を割り当てるために見た中で最も一般的な方法のような何かを行うことですnum_row intへのポインタへのポインタ(各ポインタは、 'column'の開始アドレスを指します)。したがって、外側の次元の各要素は行を指し、各行にはnum_colsの整数のグループである内側の次元( 'columns')にはnum_colsの要素があります。これはあなたに理にかなっていますか?したがって、num_rows整数ポインタを割り当てる必要があります。これらの各ポインタは、その行の最初の '列'を指します。各行に対してnum_colsの整数を割り当てる必要があります。したがって、ループが合計でnum_rows * num colsそれらの配列は配列のインデックス表記法を使用することができます(この場合は2次元です。外側の次元の各要素は '行'の始点を指します。この行には '列 '、したがってダブルポインタ)を使用して要素にアクセスします。私はこれがおそらく混乱していることを知っています。なぜなら、何度も何度も説明しようとしたのですが、特にあなたが特に理解していないことについて質問してください。あなたはそれを理解するのに助けになります。

このように2次元配列を作成する必要はありません。あなたのやり方もうまくいきます。私は、あなたがそれに遭遇する可能性が高いので、非常に一般的なので、あなたにこの方法を示したかったのです。

また、Valgrindを見てください。このツールを使用して、free()が忘れていないかどうかを調べることができます。malloc()が不一致で、割り当てられたメモリが到達不能であるかリークされているかを知ることができます(free()の呼び出しの前にポインタが変更された適切にメモリを解放すると、リークが発生します)。

関連する問題