首页 > 解决方案 > 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;
}

我想知道第二个程序的编写方式是否正确?
如果不正确,为什么会这样?
如果正确,为什么我在互联网上找不到这样的程序?

标签: cdata-structuresmemory-managementlinked-liststructure

解决方案


您的第一个程序返回一个指向(分配的)结构的指针。now的调用者createNode有责任free()在指针超出范围之前 ing 其内存,并且节点存在的好处直到它因此是free()d。

您的第二个程序按值返回一个结构,根本没有“分配”的内存。事实上,函数node内部创建的结构在createNode函数返回时不复存在;函数的调用者获得该(本地)结构的副本。(尽管大多数编译器会将其优化为无。)

您不会经常看到第二种类型,因为:

1)它确实是一个冗余的函数调用;代替...

ssl node = createNode();

……打电话……

ssl node = { 0, NULL };

2)该节点将再次存在,直到当前范围结束。如果您在 function 中构建类似的链表initList(),例如返回指向该列表中第一个节点的指针,则一旦initList()返回所有这些节点将超出范围,并且您的指针将指向任何内容。好吧,无论如何都没有分配节点结构。;-) 如果您在循环中初始化这些节点,每个单独的节点将在其循环迭代结束时超出范围......所有这些很可能不是您想要的。;-)


推荐阅读