0

リンクされたリストをいじっているだけですが、頭の中で多くのことが間違っているようです。関数でこれを試しましたが、機能しませんでした。もっとシンプルにすればうまくいくと思ったのですが、それでもうまくいきません。通常、最初の要素だけを正しく出力し、次にランダムな巨大な数を出力します (メモリアドレスが最も可能性が高い)

リストを作成してその内容を印刷したいだけです。

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

struct el{
    int value;
    struct el *next;
};

typedef struct el Elem;



int main()
{
    int nr, i;
    struct el *Head, *Conductor;
    Head = malloc(sizeof(Elem));
    Conductor = Head;
    printf("How many elements do you want to add? ");
    scanf("%d", &nr);
    for(i = 0; i < nr; i++)
    {
        printf("Enter value for element %d:  ", i);
        scanf("%d", &(Conductor->value));
        Conductor = Conductor->next;
        Conductor = malloc(sizeof(Elem));


    }
    free(Conductor->next);
    Conductor->next = NULL;

    Conductor = Head;
    printf("\n");

    for(i = 0; i < nr; i++)
    {
        printf("%d ->  ", Conductor->value);
        Conductor = Conductor->next;
    }

   return 0;
}
4

4 に答える 4

5

nextポインタにメモリを割り当てません。

割り当てる前に割り当てる必要があります。

scanf("%d", &(Conductor->value));
Conductor->next = malloc(sizeof(Elem));
Conductor = Conductor->next;
于 2013-05-31T12:02:10.813 に答える
2

Conductor->nextメモリは、に割り当てる必要があります。

ループを次のように変更します。

for(i = 0; i < nr; i++)
{
    printf("Enter value for element %d:  ", i);
    scanf("%d", &(Conductor->value));
    Conductor->next = malloc(sizeof(Elem));
    Conductor = Conductor->next;

}
于 2013-05-31T12:05:55.867 に答える
1

ここに: Conductor = Conductor->next;

Conductor には NULL 値が割り当てられているため、それを逆参照してループの次の反復で入力値を格納しようとすると、セグメンテーション違反が発生します。

他の人が指摘したように、最初にConductor->next使用するメモリを割り当てる必要がありますmalloc

gdbなどのデバッガーを使用すると、このような問題を簡単に特定できるため、最終的にお勧めできますか?

Conductor->nextこれが、 gdb の使用に問題があることを発見した方法です。

問題のある命令に到達するまで、プログラムをステップ実行しました。

25    Conductor = Conductor->next;

にあるものを印刷しようとしましたnext

(gdb) print Conductor->next    

そして、ここに私が得たものがあります:

Cannot access memory at address 0x4

これは私が持っているものですがConductor

(gdb) print Conductor
$7 = (struct el *) 0x804b008

次のループで無効な値が割り当てられるため、問題があることは非常に簡単にわかります。

于 2013-05-31T12:05:52.633 に答える