1

新しいノードがスタックの最後にプッシュされる C の List の例に取り組んでいます。Bus Error: 10新しいノードを最後までプッシュしようとすると、エラーが発生し続けます。ここに私のプッシュ機能があります:

void push(struct node *tail, struct node *newNode) {

tail->next = newNode; // gdb says the problem is here
tail = tail->next;

}

そして、私はそれを使用して呼び出しますpush(tail, newNode);

また、必要に応じて私の構造体を次に示します。

struct node
{
    int hour;
    int minute;
    char *name;
    struct node *next;
};

そして、ここにコードを示すメイン関数がありますpush()

int main()

{
char inputString[50];
int timeHour, timeMin;  
struct node *head;
struct node *tail;

while ((scanf("%d:%d", &timeHour, &timeMin)) != EOF) {
    scanf("%s", inputString);

    if (strcmp(inputString, "enqueue") == 0) {
        if (head == NULL) {
            head = malloc(sizeof(struct node));

            head->hour = timeHour;
            head->minute = timeMin;

            // get name
            scanf("%s", inputString);
            head->name = malloc(strlen(inputString)+1);
            strcpy(head->name, inputString);

            tail = head;

            printEnqueue(head);
        } else {
            struct node *newEntry = malloc(sizeof(struct node));

            newEntry->hour = timeHour;
            newEntry->minute = timeMin;

            // get name
            scanf("%s", inputString);
            newEntry->name = malloc(strlen(inputString)+1);
            strcpy(newEntry->name, inputString);

            push(tail, newEntry);

            printEnqueue(newEntry);
        }
    } else {
        pop(&head, timeHour, timeMin);
    }
}

return 0;
}
4

3 に答える 3

1

修正 #3:while ((scanf("%d:%d", &timeHour, &timeMin)) != EOF)このループの本体内では、2 つの整数timeHourtimeMinが割り当てられたという保証はありません。おそらくあなたが意味しwhile ((scanf("%d:%d", &timeHour, &timeMin)) == 2)た。


修正 #2: 関数に値を渡すときは、変数ではなく値を渡します。tail内で行っている割り当てはpush、発信者 (あなたのmain) には表示されません。その変数へのポインターを渡し (たとえば&head、これはstruct node **)、以前と同じように に割り当てる*tail必要があります。return newNode;または、 from からpush戻り値を new として使用することもできますhead


修正: これはコンパイルされるようにも見えません。を見てみましょうpush

void push(struct node **tail, struct node *newNode) {
    (*tail)->next = *newNode; // gdb says the problem is here
    *tail = (*tail)->next;
}

の種類は*newNode何ですか? struct node. の種類は(*tail)->next何ですか? それはこのスニペットにあります:

struct node
{
    int hour;
    int minute;
    char *name;
    struct node *next;
};

不整合を修正し、コンパイル可能な最小限のテストケースがコンパイル可能であることを確認してから投稿してください。


の戻り値を確認することを忘れないでくださいscanf! あなたの場合、エラーが発生しない限り、1 を返す必要があります。


        head->name = malloc(strlen(inputString));
        strcpy(head->name, inputString);

'\0'文字を保存するのに十分なスペースを割り当てていないため、これは間違っています。私はあなたが意味したと思いますmalloc(strlen(inputString) + 1)。コードには、このエラーのインスタンスが 2 つあります。繰り返すつもりはありません。


        struct node *newEntry = malloc(sizeof(struct node));
        push(&tail, newEntry);

の種類はnewEntry何ですか? struct node *.

        void push(struct node **tail, struct node **newNode)

の種類はnewNode何ですか? struct node **. 矛盾が見えますか?を渡す必要がありますstruct node **newEntrystruct node *です。

于 2013-04-16T04:17:03.383 に答える
1

変化する

void push(struct node *tail, struct node *newNode) 
{
  tail->next = newNode; // gdb says the problem is here
  tail = tail->next;
}

void push(struct node **tail, struct node *newNode) 
{
  (*tail)->next = newNode; // gdb says the problem is here
  (*tail) = (*tail)->next;
}

次に、代わりにこのように呼び出します

push(&tail, newEntry);

あなたが現在持っているように、変数のアドレスを関数に渡さないため、「テール」は決して変更されないため、それが指すものを変更することはできません。

また、必ずすべてのローカル変数 (header、tail、...) を初期化し、習慣にしてください。

于 2013-04-16T06:07:44.687 に答える