在这个问题中,详细解释了malloc在字符数组中的用法。
我什么时候应该在 C 中使用 malloc,什么时候不应该?
对于 C 中的结构也是如此吗?
例如,考虑以下定义:
struct node
{
int x;
struct node * link;
}
typedef struct node * NODE;
考虑上述结构的以下两种用法:
1)
NODE temp = (NODE) malloc(sizeof(struct node));
temp->x =5;
temp->link = NULL;
2)
struct node node1, *temp;
node1.x = 5;
node1.link = NULL;
temp = &node1;
我是否可以使用第二个示例中的temp
声明,并使用 temp->link = &node2
(指向 node2 结构的指针)将node1.link
点修改为另一个结构struct node node2
?在这里,此实现用于创建树数据结构。
这些结构是否也遵循与上述链接中所述的数组相同的规则?因为我看到的许多实现都是在第一次使用之后。使用 malloc
有什么具体原因吗?
您可以执行 #2 中描述的操作,但请记住,只要node1
在范围内,它就会起作用。如果node1
是函数中的局部变量,那么当函数返回时,它引用的内存位置将被回收并用于其他内容。程序中仍指向&node1
的任何其他指针将不再有效。使用 malloc
动态分配内存的优点之一是,在您调用 free
显式释放内存之前,它一直有效。
第一次使用堆内存,它几乎和你的物理内存一样大,但第二次使用堆栈momory,这很吓人(通常为8M)
是的。你可以执行"temp->link = &node2;",因为temp指向node1。
是的,这个规则在 C 中非常通用,所以它可以适用于数组。
使用 malloc 时,空间分配在堆中而不是堆栈中。这允许您为大型数据结构分配更多空间。缺点是你还需要在使用后"释放"内存。否则,将发生内存泄漏。
如果动态分配内存,则必须通过调用 free() 以编程方式释放该内存。
首先,您动态分配内存,它将从堆中分配内存。如果您将数据存储在内存heap
它将一直保留到您调用free
否则它将在程序终止时释放内存。
第二个将值存储在stack
其作用域是函数的本地
您的示例似乎正在处理链表,因此您可能随时需要添加或删除节点,因此使用动态分配是最佳选择。