c - c中链表结构的不同类型的内存分配
问题描述
我正在以两种方式在“c”中编写单链表程序(它们在为结构分配内存的方式上有所不同)。
1.
struct SingleLinkedList
{
int data;
struct SingleLinkedList* next;
};
typedef struct SingleLinkedList sll;
sll* createNode()
{
sll* node = (sll*) malloc(sizeof(sll));
node -> next = NULL;
return node;
}
2.
struct SingleLinkedList
{
int data;
struct SingleLinkedList* next;
};
typedef struct SingleLinkedList sll;
sll createNode()
{
sll node;
node.next = NULL;
return node;
}
我想知道第二个程序的编写方式是否正确?
如果不正确,为什么会这样?
如果正确,为什么我在互联网上找不到这样的程序?
解决方案
您的第一个程序返回一个指向(分配的)结构的指针。now的调用者createNode
有责任free()
在指针超出范围之前 ing 其内存,并且节点存在的好处直到它因此是free()
d。
您的第二个程序按值返回一个结构,根本没有“分配”的内存。事实上,函数node
内部创建的结构在createNode
函数返回时不复存在;函数的调用者获得该(本地)结构的副本。(尽管大多数编译器会将其优化为无。)
您不会经常看到第二种类型,因为:
1)它确实是一个冗余的函数调用;代替...
ssl node = createNode();
……打电话……
ssl node = { 0, NULL };
2)该节点将再次存在,直到当前范围结束。如果您在 function 中构建类似的链表initList()
,例如返回指向该列表中第一个节点的指针,则一旦initList()
返回所有这些节点将超出范围,并且您的指针将指向任何内容。好吧,无论如何都没有分配节点结构。;-) 如果您在循环中初始化这些节点,每个单独的节点将在其循环迭代结束时超出范围......所有这些很可能不是您想要的。;-)