2011-11-13 3 views
3

私は長い間Cを使用していませんでしたが、まだまだ新しいです。私はポインタと参照の構文が混乱しています。基本的には、配列として動的に割り当てているポインタを持つ構造体コンテナがあります。私はそれで終わったときにその記憶を解放する方法を知りたい。私は構造体ではない何かからメンバーを要求していますことを私に言って、コンパイラのエラーを取得する構造体の内部から動的に割り当てられたメモリを解放するにはどうすればよいですか?

typedef struct { 
    int* foo; 
} Bar; 

typedef Bar * BarRef; 

BarRef newBar(int n) { 
    BarRef B = malloc(sizeof(Bar)); 
    B->foo = calloc(n,sizeof(int)); 
} 

/* This is what I am having trouble understanding */ 
void freeBar(BarRef *B) { 
    free(B->foo); 
    B->foo = NULL; 
    free(B); 
    *B = NULL; 
} 

:ここでは次のように見えるものです。しかし、私はRef*を渡すと思ったので、それは構造体を渡すようなものです。私は、GCCを使用してANSI C.

答えて

7
void freeBar(BarRef * B) { 
    // Here B is a pointer to a pointer to a struct Bar. 
    // Since BarRef is Bar * 
    // And B is a BarRef * 
} 

をあなたが(NULLにポインタを設定する)構造体のバーにポインタを変更したいので、あなたがBarRef *を渡すには正しいですが、あなたの内容よ手順は次のようになります。

free((*B)->foo); 
(*B)->foo = NULL; 
free(*B); 
*B = NULL; 

(*B)->foo作品を以下のように:

(*B)逆参照Bを、あなたに与えられたBarRef(AKA Bar *(*B)->foo という要素に、(*B)が表示されます。

B->fooが無効です。これは、Bが指し示すバー構造のfooという要素にアクセスすることを意味します。 Bは棒構造を指していませんが、代わりにpointer to a bar structureを指しているので、「構造体ではないものからメンバーを要求しています」というエラーが表示されます。 「構造体ではないもの」は、構造体へのポインタです。

関連する問題