0

リンクされたリストであるはずのポインターと関数を使用してこのプログラムを作成しました。「アクセス違反の読み取り場所 0xcdcdcded」が表示され続けます。以下の最後の部分で。次に初期化していない可能性があると思いますが、ポインターが初めてで、その方法がわかりません。どんな助けでも大歓迎です。

typedef struct temp 
{
    char name[20];
    char telephone[10];
    temp *next;
} node;


node* creation1 ()
{    
    node *NEW = NULL;
    NEW = (node*)malloc(sizeof(node)); 
    return NEW;
}

node* creation2 ()
{   
    node *start= NULL;
    node *NEW = creation1();
    start= NEW;
    return start;
}

node* creation3 ()
{    
    node *NEW = creation1();
    node *current = NULL;
    current=NEW;
    return current;
} 

void consult ()
{   
    node *NEW= creation1();
    node *start= creation2();
    node *current = creation3();
    int exit;
    printf("How many contacts do you wish to add? ");
    scanf("%i",&exit);

    for(int i=1; i<=exit; i++)
    {
        NEW = (node*)malloc(sizeof(node));
        current->next=NEW;                 
        current = NEW; 
        fflush(stdin);
        puts("NAME: ");
        gets(NEW->name); 
        puts("TELEPHONE: ");
        gets(NEW->telephone);
        NEW->next=NULL;
    } 

    current=start->next;

    int i = 0;
    do 
    {
        i++;
        current = current->next; //this is where it stops and gives me the access reading violation
    }while (current != NULL);
}

int main(int argc, char** argv)
{  
    consult();
}
4

1 に答える 1

0

これはおそらく宿題のように思えるので、あまり教えたくありませんが、基本的な問題は、最初に行で開始ノードを作成することですnode *start= creation2();。実行のこの時点では、 の値start->nextはガベージであり、何でもかまいません。

次に、forループでは、startノードはまったく触れられません。つまり、start->nextまだ何でもかまいません。

次に、 の行で、のガベージ値current=start->next;を設定currentしています。start->next

そして最後にcurrent = current->next;、ガベージ値を逆参照している行で、メモリ内のランダムな場所にジャンプしています。

一般に、ポインター値 ( などstart->next) があり、作成時にポインターを設定するのに適切な値がない場合は、それを に設定する必要がありますNULL。次に、(->演算子を使用して) 値を逆参照する前に、 の左側の変数->が と等しいかどうかを確認しNULL、等しい場合は操作を実行しないでください->。何が起こっているのかを説明するコメントがコードにないため、これ以上具体的なアドバイスをするのは非常に困難です。

于 2012-10-21T08:04:16.007 に答える