2012-03-25 19 views
4

内構造体の割り当て:は動的に私が動的にメンバーとして別の構造体を持つ構造体を割り当てています構造体

struct a { 
    // other members 
    struct b; 
} 

struct bは基本的に別のstruct bへのポインタを保持しているので、リンクリストとしてstruct b考えます。

動的にstruct aを割り当てると、その内に新しいstruct bが作成されます。しかし、それをすることとの違いは何ですか?struct astruct bへのポインタを保持し、struct bstruct aに動的に割り当てますか?実装の違いは何ですか?

答えて

8

あなたが動的に割り当てた場合(malloc関数)struct a

struct a *temp = (struct a *)malloc(sizeof(struct a)); 

のように、あなたが、あなたがstruct bためmallocスペースない(つまり、struct aにあるものだと仮定して)struct bへのポインタのためのmallocスペース。それはあなたがしようとstruct bを使用する前に、後であなたが

temp->b = (struct b *)malloc(sizeof(struct b)); 

を行う必要があるでしょうを意味します。

struct bにポインタを格納せず、struct bに直接ポインタを格納すると、struct aを定義すると自動的に割り当てられます。

3

この違いは、「自動」割り当てと「動的」割り当てを比較している他の状況と実質的に同じです。

ポインタメンバーを使用する必要がある場合のガイドでは、手動メモリ管理を扱う際のプログラマのオーバーヘッドのために、必然的にそれにつながるバグ)。

既存の構造体bを参照するには、構造体aが必要な場合があります。


1.メモリが自動的にクリーンアップされるため、「自動」はこの種の割り当てのC標準で使用される用語です。

9

まず、このコンクリートを作るためにいくつかの実際の定義を用意しましょう。

struct b { 
    int x; 
}; 

struct a_with_b { 
    struct b b; 
} 

struct a_with_b_ptr { 
    struct b *bp; 
} 

あなたは、構造体をカプセル化する場合は、あなただけの(内部構造体がポインタではありませんので、あなたがinnert構造体のメンバを参照するために.を使用)、外側構造体を割り当てる必要があります。

struct a_with_b *a1 = malloc(sizeof(struct a_with_b)); 
a1->b.x = 3; 

しかし、ポインタをカプセル化するときは、内部構造体のメンバを参照するときに、それぞれ独立して割り当てを行い、->を使用する必要があります。

struct a_with_b_ptr *a2 = malloc(sizeof(struct a_with_b_ptr)); 
a1->b = malloc(sizeof(struct b)); 
a1->b->x = 3; 
関連する問題