-2

ここでセグメンテーション違反の原因がわかりません。コードは次のとおりです。

struct node {
    int data;
    struct node* next;
};

void add(int a,struct node *lista)
{
    struct node *p;
    p=(struct node*)malloc(sizeof(struct node*));

    p->data=a;
    p->next=NULL;

    while(lista->next!=NULL)       <--- The segmentation fault is here. 
        lista=lista->next;                    
    lista->next=p;

    return lista;

}

int main(void)
{
    struct node *list=NULL;
    list_print(list);

    list=node123();
    list_print(list);

    add(7, &list);
    list_print(list);

    return 0;
}

リストの最後に新しいノードを追加する追加機能は、友人のコンピューターとセットアップでこのように完全に機能しました。セグメンテーション違反が発生します。問題はlista->next表現だと思いますが、理由がわかりません。何か案は?

4

5 に答える 5

2

void add(int a,struct node *lista)... 2 番目のパラメーターは構造体ノード ポインターです。

struct node *list=NULL;-- list は構造体ノード ポインターです。

add(7, &list);-- &list は構造体ノード **; これは正しくなく、add() の `while(lista->next!=NULL) が逆参照に失敗する可能性があります。

于 2012-09-05T11:45:46.137 に答える
1
p = (struct node*)malloc(sizeof(struct node*));

これは確かに間違っています。ポインター自体のサイズではなく、実際の構造体と同じサイズのメモリを割り当てる必要があります。使用する

p = malloc(sizeof(struct node));

またはさらに良い

p = malloc(sizeof(*p));

そして、神の愛のために、malloc() の戻り値をキャストしないでください。

また、 as を宣言liststruct node *add()関数も - を想定しているため、そのアドレスstruct node *を関数に渡すのは誤りです。それ以外の

add(7, &list);

書きます

add(7, list);
于 2012-09-05T11:45:58.667 に答える
0

リストのアドレスを渡していますが、関数はポインタのみを取ります。参照によって「リスト」を渡すために、addtoのデクリレーションを変更する必要があります。

void add(int a,struct node **lista);

次に、「list」の代わりに(* lista)を使用します。例:(* lista)->next..。

于 2012-09-05T11:47:27.757 に答える
0

どのタイプのデータ (void) も返さないために「add」を宣言しました。しかし、あなたは「リスト」を返しています。'list' へのポインターへのポインターで機能するようにします (*list の代わりに **list をパラメーターとして使用します)。またはリスト型を返すようにします: struct list* add(

于 2012-09-05T11:50:36.163 に答える
0

1 - lista->next を呼び出す前に、lista が null でないかどうかを確認する必要があります

2 - malloc にエラーがあります: p=(struct node*)malloc(sizeof(struct node));

割り当てるnodeサイズは a のサイズであり、ポインタのサイズを割り当てましたstruct node*

3 - lista が既にポインターであるためではadd(7 , lista)ありません。add(7 , &lista)

于 2012-09-05T11:46:03.277 に答える