簡體   English   中英

C malloc堆棧與堆問題

[英]C malloc stack vs heap issue

我正在用C實現二進制搜索樹的插入功能,並且遇到了malloc問題。

首先,我有一個Tree and Node結構

typedef struct Node {
    double value;

    struct Node *parent;
    struct Node *right_child;
    struct Node *left_child;
} Node;

typedef struct Tree {
    struct Node *root;
} Tree;

這是我的插入功能,用於將值插入樹中。

void insert(Tree *t, double v) {

    Node *n = malloc(sizeof(Node));
    n->left_child = malloc(sizeof(Node));
    n->right_child = malloc(sizeof(Node));
    n->parent = malloc(sizeof(Node));
    n->value=v;

    Node *x = t->root, *y = NULL;

    //follow tree down until we reach a leaf of the tree
    while (x) {

        //save last non-NULL value. We will insert node n as a child to this leaf.
        y = x;

        if (n->value < x->value) {
            x = x->left_child;
        } else {
            x = x->right_child;
        }
    }

    //The parent of the node to insert is the leaf we reached
    n->parent = y;

    //If n is greater than y then it is its right child and vice-versa.
    if (n->value > y->value) {
        y->right_child = n;
    } else {
        y->left_child = n;
    }

}

而我的主要方法

int main(void) {

    Node n1;

    n1.value = 4;
    n1.parent = NULL;
    n1.left_child = NULL;
    n1.right_child = NULL;

    Tree t;

    t.root = &n1;

    insert(&t,2.0);

    printf("In order traversal\n");
    inOrderTraversalNode(t.root);

    return EXIT_SUCCESS;
}

當我打印有序遍歷代碼時,我得到未定義的行為(例如: 26815615859885194199148049996411692254958731641184786755447122887443528060147093953603748596333806855380063716372972101707507765623893139892867298012168192.000000 )。

我很確定問題是在insert方法中創建了Node 我認為問題是新節點存在於堆棧上,然后在insert函數退出時被銷毀-這就是在遍歷期間導致未定義行為的原因。 但是,我認為malloc將變量存儲在堆上並使其全局可用。 還是節點在堆上,但指針在堆上? 有人可以告訴我我要去哪里錯嗎?

通過malloc分配的內存中的初始內容是不確定的。

首先,刪除n->parent = malloc(sizeof(Node)); ,這會導致內存泄漏。

其次,改變

  n->left_child = malloc(sizeof(Node));
  n->right_child = malloc(sizeof(Node));

  n->left_child = NULL;
  n->right_child = NULL;

以便程序可以正確識別葉子。

嘗試使用calloc而不是malloc 問題在於, malloc不會將值初始化為零,而是分配空間。 calloc將您需要的空間清零。 因此,當您到達無效但也不為NULL的指針時,有時會跳轉到內存的隨機部分。

malloc和朋友肯定是在堆上分配,您已經有了正確的想法; 它們返回的是一個指向內存中的空間的指針 ,該空間至少要達到您要求的大小,並且絕對可以安全地讀取和寫入。 但是,由於在使用malloc時該值不會從零開始,因此無法保證存儲在結構中的指針實際上是有效的位置。

編輯:另外,其他海報是正確的:您所做的工作肯定存在內存泄漏。 沒有抓住。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM