0

このプログラムをGDBでデバッグしようとしましたが、非常に奇妙なクラッシュエラー(SIGABRT)が発生します。これは私のポップ関数で発生しますが、理由はわかりません。誰かが私を助けることができますか?どうもありがとう!

私はGDBをステップスルーしましたが、クラッシュはi = 9で、pop関数のfree(tmp)で発生すると思います。

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

#define SIZE 10
#define FALSE 0
#define TRUE  1


struct linkedStruct
{
    int elem;
    struct linkedStruct*  next;
};

typedef struct linkedStruct linked;
typedef linked* linkedPtr;

void push (linkedPtr* hd, int val)
{
    linkedPtr ptr = (linkedPtr) malloc (sizeof(linked));
    ptr->elem = val;
    ptr->next = *hd;
    *hd = ptr;
}

int isEmpty (linkedPtr hd)
{
    if (hd == NULL)
        return TRUE;
    else
        return FALSE;
}


int top (linkedPtr hd)
{
    return (hd->elem);
}

void pop (linkedPtr hd)
{
    linkedPtr tmp = hd;
    hd = hd->next;
    free (tmp);
}

void show (linkedPtr hd)
{
    while (hd != NULL)
    {
        printf ("%d, ", hd->elem);
        hd = hd->next;
    }
    printf ("\n");
}

int main (int argc, char**argv)
{
    linkedPtr head = NULL;
    int i;
    int temp;

  /* push 10 random values onto the stack showing the stack growing */
    for (i = 0 ; i < SIZE; ++i)
    {
        temp = rand() % 100;
        printf ("In main(): temp: %6d\n", temp);
        push (&head, temp);
        show (head);
    }

    printf ("\n");

  /* remove the value from the stack */
    while (!isEmpty(head))
    {
        printf ("Top of stack value is: %d\n", top(head));
        pop (head);
    }
}
4

1 に答える 1

0

ここでの実際の問題は、への変更がhd呼び出し元に表示されないことです。free()これにより、すでに解放されているメモリで呼び出され、未定義の動作が発生します。

次のpop()ようになります。

void pop (linkedPtr* hd)
{
    linkedPtr tmp = *hd;
    *hd = (*hd)->next;
    free (tmp);
}

そしてこのように呼ばれます:

pop(&head);
于 2013-03-19T14:01:57.320 に答える