0

我尝试在 GDB 中调试这个程序,但我得到一个非常奇怪的崩溃错误(SIGABRT)。它发生在我的 pop 函数中,但我不知道为什么。有人能帮我吗?非常感谢!

我逐步浏览了 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 回答