2

たとえば、最初のノードの後に​​ノードに十分なメモリを与えないという問題が発生しましたfirstNode = (node)malloc(sizeof(node))。以下は、*nodeの構造とmalloc関数を使用する挿入関数です。

typedef struct treeNode *node;

struct treeNode {
    node left;
    node right;
    int data;
};

node firstN;
node secondN;

node insert(int a, node t){
    if(t==NULL){
        t = (node)malloc(sizeof(node));
        t->data = a;
        t->left = NULL;
        t->right = NULL;
    } else {
        if(a < t->data){
            t->left = insert(a, t->left);
        }else if(a > t->data){
            t->right = insert(a, t->right);
        }
    }
    return t;
}

これが、mallocを使用して挿入プロセスをテストしたmain()です(メインで行ごとにテストしていたため、上記で定義した挿入関数は使用しませんでした)。

firstN=(node)malloc(sizeof(node)*10);
firstN->data=1;
firstN->right=NULL;
firstN->left=NULL;
firstN->right=(node)malloc(sizeof(node)*10);

私にとって興味深いのは、上記は機能しますが、通常は(node)malloc(sizeof(node))(10を掛けない)を実行しても、2番目のインスタンスfirstN->rightでは機能しないことです。

それが正しい場合、なぜコードが十分なメモリを与えていないのだろうか。

4

2 に答える 2

9

これ:

t = (node)malloc(sizeof(node));

間違っています。構造を保持するのに十分なメモリを割り当てていません。これnodeは「ポインタ」のエイリアスであるため、構造へのポインタだけstruct treeNodeです。

必要なもの:

t = malloc(sizeof *t);

それがいかに簡単であるかに気づきましたか?キャストは悪い考えなので、削除する必要があります。サイズが間違っていたので、コンパイラに計算させましょう。

結果を何らかのポインタに格納している多くの(多くの)割り当ての場合p、の値は。sizeof *pへの適切な引数malloc()です。もちろん、配列を割り当てている場合、これは当てはまりません。その場合n * sizeof *p、いくつかの式に当てはまることがよくありますn

また、ポインターを非表示にするために使用することtypedefは、ポインターが重要であり、すぐに混乱するため、Cでは一般的に悪い考えです。

于 2012-11-27T07:36:34.863 に答える
0
typedef struct treeNode {
    struct treeNode *left;
    struct treeNode *right;
    int data;
}node;

node *firstN;
node *secondN;

node *insert(int a, node *t){
    if(t==NULL){
        t = malloc(sizeof(node));
        t->data = a;
        t->left = NULL;
        t->right = NULL;
    } else {
        if(a < t->data){
            t->left = insert(a, t->left);
        }else if(a > t->data){
            t->right = insert(a, t->right);
        }
    }
    return t;
}

int main(void) {

    firstN = malloc(sizeof(node)); /* allocating ROOT Node */
    firstN->data = 1;
    firstN->right = NULL;
    firstN->left = NULL;

    /* why are you allocating RIGHT, it will automatically be allocated when you insert Node */
    //firstN->right = (node)malloc(sizeof(node)*10);
}
于 2012-11-27T08:31:49.387 に答える