2013-06-25 26 views
5

C++での動的メモリ割り当てに関する質問があります。 私が提案しようとしている問題の性質は、単純なC++テクニックを使用して解決するのが簡単だと理解していますが、この特定の練習ではCのようなアプローチを使用する必要があります。 私は例を設定してみましょう:C++の動的割り当てメモリ内での動的メモリ割り当て

私は、次の構造体があります

typedef struct A{ 
    B *b; 
    int a; 
} 

typedef struct B{ 
    C *c; 
    int x; 
} 

typedef struct C{ 
    int y; 
} 

とのこのメインを想定してみましょう次のよう

int main(){ 
    A test; 
    test.a = 1; 

    test.b = (B*)calloc(2,sizeof(B)); 

    test.b[0].c = (C*)calloc(2,sizeof(C)); 
    test.b[0].x = 2; 
    test.b[0].c[0].y = 3; 
    test.b[0].c[1].y = 4; 

    test.b[1].c = (C*)calloc(2,sizeof(C)); 
    test.b[1].x = 5; 
    test.b[1].c[0].y = 6; 
    test.b[1].c[1].y = 7; 
} 

だから私の質問は: どうなりますか? test.b[i].cに割り当てられたメモリブロックが、以前にtest.bに割り当てられたメモリブロックと重複する可能性はありますか? それが起こる可能性がある場合、どうすればそれが起こらないようにすることができますか? 可能であれば、calloc()がメモリを割り当てる方法を正確に説明できますか?私は数値の例を本当に感謝します。

+1

また、callocから返されたポインタはNULLではないことを確認することもできます。それはより安全です。 –

答えて

4

test.b [i] .cに割り当てられたメモリブロックが、以前にtest.bに割り当てられたメモリブロックと重複する可能性はありますか?

それは私が起こってからそれを防ぐことができますどのように起こることが可能である場合は?

これは起こりえないので、心配しないでください。

もしcalloc()がメモリをどのように割り当てているかを正確に説明できますか?

あなたがcallocを呼び出すたびに、それが戻って、それが失敗した場合に要求されたオブジェクトの数、またはNULLを保持するのに十分な大きさのゼロ初期化されたメモリブロックへのポインタをあなたに与えます。 NULLが返ってこない限り、心配することはありません。

「数値の例」の意味がわかりません。

+0

迅速な回答ありがとうございます。それは本当に私の肩からのストレスを取るが、私はまだ私のコードで何が間違っているかを見つける必要があります。私はcallocがより高いレベル(ポインタ部分を意味する)で何をするのか知っています。 数値例では、特定のメモリブロック割り当てを伴う例を意味します。たとえば、callocを初めて使用するときに0x0000から0x0010などのメモリブロックを割り当てるとしたら、callocが背後でどのように動作するかを理解するのに役立ちます。あなたもそれを提供できるなら、私は本当にそれを感謝します。 –

+1

これはシステムに非常に依存しています。あなたが見たい場合は、Web上にオープンソースのCライブラリの実装がたくさんあります。 –

+0

ありがとうございました。 –

関連する問題