1

私はCを初めて使用します。構造体リストを関数に渡そうとしており、その関数内でリストに入力します。コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

struct Abc {
    int test;
    struct Abc *next;
};

void demo_fill(struct Abc *data);

int main(int argc, char **argv) {
    struct Abc *db = NULL;
    demo_fill(db);
    printf("%d\n",db->test);
    return 0;
}

void demo_fill(struct Abc *data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = data;
       data = new;
   }  
}

これを実行すると、最初の要素を印刷しようとしたときに構造体がまだNULLであるため、「セグメンテーション違反(コアダンプ)」エラーが発生します。私は何が間違っているのですか?

4

3 に答える 3

5

ポインターを値で渡しています。呼び出し元のポインターの値を変更する場合は、ポインターをポインターに渡す必要があります。

int main(int argc, char **argv) {
    struct Abc *db = NULL;
    demo_fill(&db);
    printf("%d\n",db->test);
    return 0;
}

void demo_fill(struct Abc **data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = *data;
       *data = new;
   }  
}
于 2013-02-14T16:29:55.247 に答える
2

new にデータを割り当てても効果はありません。dataポインタのローカル コピーです。それを修正するには、二重ポインターを渡します。このようなもの:

void demo_fill(struct Abc** data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = *data;
       *data = new;
   }  
}

もちろん、ポインタをメインの db に渡す必要があります。

demo_fill(&db)
于 2013-02-14T16:29:59.493 に答える