[英]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.