为什么这个struct初始化不起作用(不能返回局部变量的地址)

时间:2013-07-08 13:03:13

标签: c pointers struct

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;    
}

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

2 个答案:

答案 0 :(得分:7)

  

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

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

Node node = malloc(sizeof(Node));

因为node 不是指针,并且在堆栈上分配,因此编译器警告它是一个局部变量。改为:

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

  

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

第二个片段也是错误的,因为它只为Node*分配足够的内存,因为它需要为Node分配内存。

答案 1 :(得分:3)

这是正确的方法:

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

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