2

この関数を実装して、部門 d のツリーを作成し、分岐因子 b を使用します。

void create(node *n, int b, int d){
int cont,i;


if(d>0){
    n->children = (node *) malloc(b*sizeof(node));

    if(!n->children){
        printf("\n\nMemory couldn't be allocated\n");
        getchar();
        return;
    }
    n->alpha = -100;

    for(i=0;i<b;i++){
        create((n->children+i*sizeof(node)), b, d-1);   

    }
}
else if(d==0){
    if(n){
        n->alpha = rand()%9 + 1;
        printf("%d  ",n->alpha);
    }

}

d<6 および b<6 の場合は問題なく動作しますが、b =6 および d=6 以上の場合、セグメンテーション エラーが発生します。

しかし、行create((n->children+i*sizeof(node)), b, d-1);を変更すると、create((&n->children[i]), b, d-1); 、私がテストした限り、それは任意の d と b に対して完全に機能します。しかし、2つの行は本当に同じです!!! children 構造体のアドレスだけ....では、なぜそれが起こっているのか誰か知っていますか? malloc は 1 つの連続したメモリ ブロックを割り当てませんか?

これは本当に私を混乱させました!! 助けてください!

ありがとう =) 、

イングリッド

4

1 に答える 1

1

あなたはあなたの質問に答えました。:D

しかし、行 create((n->children+i*sizeof(node)), b, d-1); を変更すると、create((&n->children[i]), b, d-1); の行については、私がテストした限り、任意の d および b に対して完全に機能します。しかし、2つの行は本当に同じです!!! children 構造体のアドレスのみ

2 つの行は、ポインター演算がオブジェクトの型を考慮し、そのオブジェクト型のサイズで結果のアドレスを正しく調整するため、同じではありません。そう :

   n->children+i === &n->children[i]

どちらも while に変換され(n->children)+ (i * sizeof(struct node)) ます。コードは次のとおりです。

(n->children+i*sizeof(node)

に変換され(n->children)+ (i * sizeof(struct node))*sizeof(struct node)ます。最初の sizeof 演算子は誤って追加されたものですが、2 番目の演算子はポインター演算によって自動的に追加されます。

d<6 および b<6 の場合は問題なく動作しますが、b =6 および d=6 以上の場合、セグメンテーション エラーが発生します。

malloc関数がパフォーマンス上の理由で必要とされるよりも多くのメモリをプロセス空間にマップするため、少数で機能しました。正しくマップされたメモリ領域を超えると、セグメンテーション違反が発生しました。

malloc は 1 つの連続したメモリ ブロックを割り当てませんか?

はい、malloc連続メモリ ブロックを割り当てます。

于 2013-10-30T18:21:22.227 に答える