C malloc堆栈与堆问题
我正在用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函数,它
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;