75749


二分探索木をc言語で実装するときに，わからない部分がありました．  
実装したコードは以下のとおりです．

[code]

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node{
        int value;
        struct node* left;
        struct node* right;
        } Node;
    
    Node* makenode1(int value){
        Node newnode={value, NULL, NULL};
        Node* n = & newnode;
        printf("n->left①：%p\n", n->left);
        printf("n->right①：%p\n", n->right);
        return n;
    }
    
    Node* makenode2(double x){
        Node* n = malloc(sizeof(Node));
        if (n != NULL) {
            n->value = x;
            n->left = NULL;
            n->right = NULL;
        }
        printf("n->left①：%p\n", n->left);
        printf("n->right①：%p\n", n->right);
        return n;
    }
    
    Node* insert(Node* n, int value, int makenodetype){
        if(n==NULL){
            if(makenodetype==1) n = makenode1(value);
            else n = makenode2(value);
            printf("n->left②：%p\n", n->left);
            printf("n->right②：%p\n", n->right);
        }else{
            if(value < n->value){
                n->left = insert(n->left, value, makenodetype);
            }
            else{
                n->right = insert(n->right, value, makenodetype);
            }
        }
        return n;
    }
    
    int main(void){
        printf("----------1----------\n");
        Node* root1 = NULL;
        int makenodetype = 1;
        root1 = insert(root1, 5, makenodetype);
        printf("root1->value：%d\n", root1->value);
        printf("root1->left：%p\n", root1->left);
        printf("root1->right：%p\n", root1->right);
        printf("----------2----------\n");
        Node* root2 = NULL;
        makenodetype = 2;
        root2 = insert(root2, 5, makenodetype);
        printf("root2->value：%d\n", root2->value);
        printf("root2->left：%p\n", root2->left);
        printf("root2->right：%p\n", root2->right);
        printf("---------------------\n");
        return 0;
    }
    
[/code]

私の環境での実行結果は以下のとおりです．

[code]

    ----------1----------
    n->left①：0x0
    n->right①：0x0
    n->left②：0x0
    n->right②：0x7ffeeb34c790
    root1->value：16
    root1->left：0x7ffeeb34c870
    root1->right：0x7ffeeb34c790
    ----------2----------
    n->left①：0x0
    n->right①：0x0
    n->left②：0x0
    n->right②：0x0
    root2->value：5
    root2->left：0x0
    root2->right：0x0
    ---------------------
    
[/code]

makenode1を用いた場合（makenodetype=1とした場合）では上手く動作しません．  
なぜ，n->right①：0x0とn->right②：0x7ffeeb34c790で値が違うのでしょうか


CC BY-SA 4.0
2021-05-09T12:23:20.780
75748
2021-05-09T15:33:34.543
25280
question
c
構造体のポインタが上手く使えません


auto 変数はスタック領域に用意され, 関数を抜ける際に開放されます  
それに対し, `malloc()` の場合はヒープ領域で, (`free()` で)明示的に開放(あるいはプログラム終了)するまで残ります

以下のコードで, `newnode`, `n` は `return` 時に消えてしまいます。  
戻り値としての `n` の値は呼び出し元に返るけど, そのポインターが指し示す先は何が入ってるか不定  
(単純に関数から戻るだけなら 破壊されない可能性もあるけど, 割り込みなどの要因もあるので)

[code]

    Node* makenode1(int value){
        Node newnode={value, NULL, NULL};
        Node* n = & newnode;
        printf("n->left①：%p\n", n->left);
        printf("n->right①：%p\n", n->right);
        return n;
    }
    
[/code]


CC BY-SA 4.0
2021-05-09T13:28:11.387
75749
2021-05-09T15:33:34.543
2021-05-09T15:33:34.543
43025
43025
75748
answer