Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C malloc堆栈与堆问题_C_Binary Search Tree_Heap Memory_Stack Memory - Fatal编程技术网

C malloc堆栈与堆问题

C malloc堆栈与堆问题,c,binary-search-tree,heap-memory,stack-memory,C,Binary Search Tree,Heap Memory,Stack Memory,我正在用C实现二叉搜索树的插入函数,我遇到了malloc的一个问题 首先,我有一个树和节点结构 typedef struct Node { double value; struct Node *parent; struct Node *right_child; struct Node *left_child; } Node; typedef struct Tree { struct Node *root; } Tree; 这是我的insert函数,它

我正在用C实现二叉搜索树的插入函数,我遇到了malloc的一个问题

首先,我有一个树和节点结构

typedef struct Node {
    double value;

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

typedef struct Tree {
    struct Node *root;
} Tree;
这是我的insert函数,它将一个值插入到树中

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;
    }

}
当我打印顺序遍历代码时,我得到的是未定义的行为(例如:
26815615859885819419914804999641169225495887316411847867554471228874435280601470939536037485963338068553800637163721017075077656238931398928678012168192.000000


我很确定问题在于
insert
方法中的
节点的创建。我假设问题在于堆栈上存在新节点,当
insert
函数退出时,新节点将被销毁-这就是遍历过程中导致未定义行为的原因。但是,我认为
malloc
将变量存储在堆上并使其全局可用。或者节点在堆上,但指针在堆栈上?有人能告诉我哪里出错了吗?

通过
malloc
分配的内存中的初始内容未定义

首先,删除
n->parent=malloc(sizeof(Node)),这会导致内存泄漏

第二,改变

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


这样程序才能正确识别叶子。

尝试使用
calloc
而不是
malloc
。问题在于
malloc
不会将值初始化为零,它只分配空间
calloc
将您请求的空间归零。所以,当你找到一个无效但也不是空的指针时,你偶尔会跳转到内存的随机部分

malloc
朋友们肯定会在堆上分配,你的想法是对的;它们返回的是一个指向内存中某个空间的指针,该空间的大小至少与您请求的大小相同,绝对可以安全地进行读写。但是,由于在使用
malloc
时,该值没有从零开始,因此无法保证存储在结构中的指针实际指向有效位置


编辑:另外,另一张海报是对的:你所做的肯定是内存泄漏。我看到
main
创建了一个
节点
,并初始化指向
NULL
的指针,但是当
insert
创建了一个
节点
时,它通过调用
malloc
来初始化指针。但是,
malloc
返回的
节点
本身没有初始化。谢谢,这似乎可以工作。我在这篇文章中读到为结构中的指针分别分配内存
  n->left_child = malloc(sizeof(Node));
  n->right_child = malloc(sizeof(Node));
  n->left_child = NULL;
  n->right_child = NULL;