0

printfこのプログラムは、最初のステートメントの後でセグメンテーション違反を引き起こします。私が知っているように、セグメンテーション違反の場合、メモリ スタックがいっぱいになります。しかし、私の場合、プログラムを4回呼び出した後にのみ、再帰的なプログラムはありません。

なぜこれが起こっているのかを理解するのを手伝ってください。

コードは次のとおりです。

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

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

void append(struct node **, int);
void addatbeg(struct node **,int);
int count(struct node *);
void display(struct node *);
void addafter(struct node **, int,int);

int main()
{
    struct node *q;
    q= NULL; //list is empty

    append(&q,10);
    append(&q,20);
    append(&q,30);
    append(&q,40);

    printf("Now display the contents of the linked list:\n");
    display(q);

    addatbeg(&q,17);
    addatbeg(&q,59);

    printf("after adding the elements in the beginning, new linked list contents are\n");

    display(q);

    addafter(&q,4, 15);
    addafter(&q,7, 25);
    printf("after adding the elements at specified location, list elements are:    \n");
    display(q);

    printf("\n\nCounting of list elements, list has %d elements", count(q));
    return 0;
}

void append(struct node **p, int num)
{
    struct node *temp, *r;
    temp=*p;
    if(*p==NULL)
    //Linked list is empty and the node to be added is the first node
    {
        temp=(struct node *)malloc(sizeof(struct node));
        temp->data=num;
        temp->link=NULL;
        *p=temp;
    }
    else
    {
        while(temp->link!=NULL)
        {
            temp=temp->link;

            r=(struct node*)malloc(sizeof(struct node));
            r->data=num;
            r->link=NULL;
            temp->link=r;
        }
    }
} 

void addatbeg(struct node **p, int num)
{
    struct node *temp, *r;
    temp=*p;

    r=(struct node *)malloc(sizeof(struct node));
    r->data=num;
    r->link=temp->link;
    *p=r;
}

void addafter(struct node **p, int loc, int num)
{
    int i;
    struct node *temp, *r;
    temp=*p;
    //first we will find out the desired loc
    for(i=0; i<loc; i++)
        temp=temp->link;
    //now need to create a new node

    r=(struct node*)malloc(sizeof(struct node));
    r->data=num;
    r->link=temp->link;
    temp->link=r;
}

void display(struct node *p)
{
    while(p!=NULL)
    p=p->link;
    printf("\n%d\t",p->data);
}

int count(struct node *p)
{
    int count=0;
    while(p!=NULL)
    {
        p=p->link;
        count++;
    }
    return count;
}
4

4 に答える 4

2

1つの問題は、でappend()、1つだけを作成するのではなく、ループ内に新しい要素を作成していることです。

63    while(temp->link!=NULL)
64    {
65     temp=temp->link;

 r=(struct node*)malloc(sizeof(struct node));
68     r->data=num;
69     r->link=NULL;
70     temp->link=r;
71    }

ただし、セグメンテーション違反の直接の原因はおそらく次のとおりです。

105 void display(struct node *p)
106 {
107   while(p!=NULL)
108   p=p->link;
109   printf("\n%d\t",p->data);
110 }

ここではprintf()、ループ内にある必要があります。NULL現在のコードは実際には要素を出力せず、ポインターを逆参照しようとします。

于 2013-03-19T06:42:22.827 に答える
0

この関数では

void display(struct node *p)
 {
   while(p!=NULL)
   p=p->link;
   printf("\n%d\t",p->data);
 }

ループが終了すると、pはNULLになります。したがって、セグメンテーション違反が発生します。

に変更します

while(p->link!=NULL){
   ...
}
于 2013-03-19T06:48:04.283 に答える
0

20〜22行目:

nullポインタのアドレスをに渡して、append未定義の動作を引き起こしています。

考えられる修正:

20 q = malloc(sizeof q);
   *q = NULL;

コードには他にも問題があるようですので、他の回答やコメントも確認してください。

于 2013-03-19T06:48:15.683 に答える
0

あなたの問題は、表示機能に起因する可能性が高いです。途中でブラケットを忘れてしまったかもしれません。

メモリ割り当てエラーに関するいくつかの非常に良いヒント、およびより一般的にメモリで間違っていることについていくつかのヒントを得るには、を使用する必要がありますvalgrind(Linux ディストリビューションを使用している場合)。

于 2013-03-19T06:44:08.343 に答える