1

仲間.私はC言語が初めてで、今日は質問に会いました.あなたたちに問題を解決してもらいたいです.

struct node {
    int a;
};
void
init_structure(struct node *c)
{
    c=(struct node *)malloc(sizeof(struct node));
    c->a=1;
}
int main(){
    struct node *ss;
    init_structure(ss);
    printf("%d\n",ss->a);
}

このセグメント コードを gcc でコンパイルしましたが、エラーは報告されませんでした。しかし、./a.out を実行した後の答えは11873660 (おそらくアドレス番号だと思います)ですが、 1ではありません。
オンラインでお待ちしております。
仲間に感謝します:)

4

1 に答える 1

5

init_structure構造体の割り当てと初期化は問題ありませんが、C では、引数は (参照ではなく) 値によって渡されるため、変更されている間cは変更されssません。代わりに、戻り値を使用して戻りcと代入を行うことができます。ss

struct node *init_structure(void)
{
    struct node *c=(struct node *)malloc(sizeof(struct node));
    c->a=1;
    return c;
}
int main(void){
    struct node *ss;
    ss = init_structure();
    printf("%d\n",ss->a);
}

これを実現する別の方法は、別のレベルの間接化を追加することです。

void init_structure(struct node **c)
{
    **c=(struct node *)malloc(sizeof(struct node));
    (*c)->a=1;
}
int main(void){
    struct node *ss;
    init_structure(&ss);
    printf("%d\n",ss->a);
}

これも機能しますが、もちろんもっと面倒です。

于 2013-03-16T05:14:05.343 に答える