0
Node *create_node() {
    Node node = malloc(sizeof(Node));
    node.cargo = next_free_cargo++;
    return &node;   
}

我以为 malloc 在堆上创建了东西?为什么这仍然被认为是局部变量?

另外,这是正确的方法吗?

Node *create_node() {
    Node *node = malloc(sizeof(Node*));
    node->cargo = next_free_cargo++;
    return node;    
}

当我读到它时,这会为指向节点的指针创建内存。但是它如何为节点本身分配内存呢?

4

2 回答 2

7

我以为 malloc 在堆上创建了东西?为什么这仍然被认为是局部变量?

malloc()动态分配内存并将分配内存的生命周期控制权交给程序员(直到free()在返回的指针上调用)。但是,这段代码不正确(编译器应该发出错误):

Node node = malloc(sizeof(Node));

asnode不是指针,而是分配在堆栈上,因此编译器警告它是局部变量。改成:

Node* node = malloc(sizeof(Node)); /* or malloc(sizeof(*node)); */
if (node)
{
    node->cargo = next_free_cargo++;
}
return node;

另外,这是正确的方法吗?

第二个片段也是不正确的,因为它只为 a 分配足够的内存Node*,而它需要为 a 分配内存Node

于 2013-07-08T13:05:47.487 回答
3

这是正确的方法:

Node *create_node() {
    Node *node = malloc(sizeof(Node));
    node->cargo = next_free_cargo++;
    return node;    
}

malloc 函数分配一个 sizeof(Node) 字节的内存缓冲区,并返回一个指向该内存区域的指针。内存是在堆上分配的,函数返回后可以引用。当不再需要时,也应该释放它的内存。

于 2013-07-08T13:09:15.637 回答