Malloc 与创建数据结构
Malloc vs Creating a Data Structure
malloc 的用途是什么,而不仅仅是在 c 函数中创建结构?例如,这是在二叉搜索树中创建节点的模型代码。
void insertBSTNode(BTNode **node, int value)
{
if (*node==NULL)
{
*node=malloc(sizeof(BTNode));
(*node)->item =value;
(*node)->left =NULL;
(*node)->right = NULL;
return;
}
if ((*node)->item > value)
insertBSTNode(&((*node)->left), value);
else if ((*node)->item <value)
insertBSTNode(&((*node)->right), value);
else
{
printf("Already exists in the BST\n");
return;
}
return;
}
我尝试做类似的事情,但改为创建结构,而不是像这样:
void insertBSTNode(BTNode **node, int value)
{
if ((*node) == NULL){
BTNode insert;
insert.item = value;
insert.left = NULL;
insert.right = NULL;
(*node) = &insert;
return;
}
else {
int Nodeitem = (*node)->item;
if (value>Nodeitem){
insertBSTNode(&((*node)->right),value);
return;
}
if (value<Nodeitem){
insertBSTNode(&((*node)->left),value);
return;
}
}
}
但 Nodeitem 始终是地址。为什么 malloc 在这种情况下有效?当我使用
BTNode insert
,这与使用 malloc 而不是 &insert
只是指向内存位置不相似吗?那我应该改用 malloc 吗?
当使用 BTNode insert;
时,您正在使用堆栈中的内存。只要您只在 insertBSTNode
函数内部处理此数据,这就很好,但是一旦您离开该函数,堆栈内存就可以(并且将会)被其他函数使用。另一方面,malloc
使用堆内存,因此您可以在调用 malloc
的函数之外使用分配的内存,而不会有被其他函数覆盖的风险。您还必须记住,一旦您的应用程序不再需要使用 malloc
分配的内存,必须手动释放它。
malloc 的用途是什么,而不仅仅是在 c 函数中创建结构?例如,这是在二叉搜索树中创建节点的模型代码。
void insertBSTNode(BTNode **node, int value)
{
if (*node==NULL)
{
*node=malloc(sizeof(BTNode));
(*node)->item =value;
(*node)->left =NULL;
(*node)->right = NULL;
return;
}
if ((*node)->item > value)
insertBSTNode(&((*node)->left), value);
else if ((*node)->item <value)
insertBSTNode(&((*node)->right), value);
else
{
printf("Already exists in the BST\n");
return;
}
return;
}
我尝试做类似的事情,但改为创建结构,而不是像这样:
void insertBSTNode(BTNode **node, int value)
{
if ((*node) == NULL){
BTNode insert;
insert.item = value;
insert.left = NULL;
insert.right = NULL;
(*node) = &insert;
return;
}
else {
int Nodeitem = (*node)->item;
if (value>Nodeitem){
insertBSTNode(&((*node)->right),value);
return;
}
if (value<Nodeitem){
insertBSTNode(&((*node)->left),value);
return;
}
}
}
但 Nodeitem 始终是地址。为什么 malloc 在这种情况下有效?当我使用
BTNode insert
,这与使用 malloc 而不是 &insert
只是指向内存位置不相似吗?那我应该改用 malloc 吗?
当使用 BTNode insert;
时,您正在使用堆栈中的内存。只要您只在 insertBSTNode
函数内部处理此数据,这就很好,但是一旦您离开该函数,堆栈内存就可以(并且将会)被其他函数使用。另一方面,malloc
使用堆内存,因此您可以在调用 malloc
的函数之外使用分配的内存,而不会有被其他函数覆盖的风险。您还必须记住,一旦您的应用程序不再需要使用 malloc
分配的内存,必须手动释放它。