2012-02-07 15 views
2

私は、次のコードを持っている:ヒープとスタックの問題 - Cプログラミング

#include <stdlib.h> 
#include <stdio.h> 

struct B 
{ 
    int _arr[5]; 
}; 
struct A 
{ 
    struct B *_pb_arr; 
}; 


int main() 
{ 
    int i,j; 
    struct B b; 
    struct B *pb = (struct B*)malloc(sizeof (struct B)); 
    *pb = b; 

    struct A a; 
    a._pb_arr = (struct B*)malloc(sizeof (struct B)*2); 
    a._pb_arr[0] = b; //first question 
    a._pb_arr[1] = *pb; //second question 

    for (i=0;i<2;++i) 
    { 
     for (j=0;j<5;++j) 
     { 
      a._pb_arr[i]._arr[j] = i; 
     } 
    } 
    struct A a2 = a; 

    for (i=0;i<2;++i) 
    { 
     for (j=0;j<5;++j) 
     { 
      printf ("%d, ", a2._pb_arr[i]._arr[j]); 
     } 
    } 
    return 0; 
} 

私の質問は次のとおりです。上の理由:a._pb_arr[0] = b; 割り当てがスタックにあります。 そして次の行に:a._pb_arr[1] = *pb 割り当てはヒープ上にありますか?

ヒープにはa.pb_arrが割り当てられており、各割り当てはヒープ上にもあるようです。

+0

これは、「割り当てが(スタック|ヒープ上にある)」という意味に依存します。 (これは標準的な用語ではありません)。最初の割り当ては、スタックからヒープに構造をコピーすることですが、2番目の割り当てはヒープのある部分から別の部分に構造をコピーすることです。 – ruakh

+0

あなたの質問は完全にはっきりしませんが、最初にスタックに定義されていたにもかかわらず、構造体が常に割り当てによってヒープにコピーされる理由を知りたいのですか? –

+0

だから、私はあなたの両方を控えめに思っています...どちらの場合でも、ヒープにコピーされますか? –

答えて

1

割り当てがスタックまたはヒープに割り当てられていないため、オブジェクトがあります。それは、このように作成されているため

オブジェクトaがスタックにある:

struct A a; 

は、ヒープ上のオブジェクトを作成するには、彼らがmallocを使用するためのメモリを割り当てる必要があります。

したがって、aはスタックにありますが、a._pb_arrはヒープになります。あなたが完了したら、あなたは明示的にfreeのメモリを持っていなければなりません。同じ理由で、bがスタックにあり、pbがヒープ上にあります。

a._pb_arrのオブジェクトを割り当てると、値はコピーされますが、メモリはa._pb_arrに割り当てられているため、ヒープに残ります。

メモリリークを防ぐためには、a._pb_arrpbの両方にfreeを使用する必要があります。

+0

しかし、a._pb_arr [0] = bのようなものではありません。構造体Bに割り当てられた最初の場所に移動し、次にbをコピーします。 –

+0

@fgfjhgrjrerjhm答えは少し曖昧だったので、編集しました。今はっきりしていることを願っています。 –

+0

ありがとう、しかし、私が "ルカ"に書いたものを見て、私はそれが私が意味したことについてより明確に思う –

関連する問題