1

私がする時:

t_node *node1;
t_node **head;
void *elem;
int c = 1;

elem = &c;
head = NULL;
node1 = malloc(sizeof(t_node));
node1->elem = elem;
head = &node1;
//add_node(node1,head); //substitute this with line above and it doesn't work
printf("%d\n",*(int*)(*head)->elem); // prints 1 and works fine

しかし、ADD_NODEと呼ばれる関数を作成すると、機能しませんか?!??!?

void add_node(t_node *node1, t_node **head){
   head = &node1;
}

これは私には意味がありません...なぜこれがこれを機能させないのでしょうか?関数を呼び出すと、文字通りまったく同じコードが実行されます。

編集:add_nodeの署名は問題になっていないことに注意してください。その署名が必要です

4

3 に答える 3

3

Cは値渡し言語です。あなたの関数は、実際には何もしませんmain()

comp.lang.cFAQでこの質問を確認してください。

于 2013-02-08T06:04:34.317 に答える
3

関数の呼び出しでは、パラメーターはその関数のみのスコープを持っているため、「head =&node1」を割り当てても、関数外の変数には影響しません。

渡した変数に影響を与えるには、変数のアドレスを渡す必要があります。例えば:

void add_node(t_node **node1, t_node ***head){
   *head = node1;
}

呼び出しは次のようになります。

add_node(&node1, &head);

'head'の値が'node1'値で更新されるように、関数で'head'ポインターを逆参照する必要があることに注意してください。

于 2013-02-08T06:14:25.227 に答える
2

'C'では、変数は参照によって渡されるため、関数呼び出しで値を変更するには、変数へのポインターを渡す必要があります。

正しい手順は-

void add_node(t_node ** node1、t_node *** head){* head = node1; }

于 2013-02-08T06:13:04.457 に答える