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;

また、これは正しい方法ですか?

Node*2 番目のスニペットも、 にメモリを割り当てる必要があるときに、 に十分なメモリを割り当てているだけなので、正しくありません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 に答える