在构建堆栈的过程中,我在Pop函数的数组内释放一个元素时遇到问题。
这是代码:

Element Pop(Stack *stackPtr)
{
    Element temp = stackPtr->content[stackPtr->size-1];
    Element* newE = (Element*)realloc(stackPtr->content,(stackPtr->size-1)*sizeof(Element));

    free(stackPtr->content[stackPtr->size-1]);

    stackPtr->content=newE;
    stackPtr->size--;
    return temp;
}


由于某种原因,free(stackPtr->content[stackPtr->size-1]);每次都会出错。
为什么会这样,我该如何解决?
谢谢。

这是整个代码:

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

typedef struct
{
    int kind; // boolean
    int num;
    char ch;
} Element;

typedef struct
{
    Element *content;
    int size;
} Stack;

void Init(Stack* stackPtr)
{
    stackPtr->content = (Element*)malloc(1*sizeof(Element));
    stackPtr->content[0].kind = 3;
    stackPtr->content[0].ch = 'a';
    stackPtr->content[0].num = -2;
    stackPtr->size = 1;
}

void Push(Stack* stackPtr, Element element)
{
    stackPtr->content = (Element*)realloc(stackPtr->content,((stackPtr->size)+1)*sizeof(Element));
    stackPtr->size++;
    stackPtr->content[stackPtr->size-1] = element;
}

Element Pop(Stack *stackPtr)
{
    Element temp = stackPtr->content[stackPtr->size-1];
    Element* newE = (Element*)realloc(stackPtr->content,(stackPtr->size-1)*sizeof(Element*));

    free(stackPtr->content[stackPtr->size-1]);

    stackPtr->content=newE;
    stackPtr->size--;
    return temp;
}

Element Top(Stack *stackPtr)
{
    return stackPtr->content[stackPtr->size-1];
}

最佳答案

当然,这会崩溃-您仅重新分配了stackPtr->content指向的数据,因此数组访问现在无效。

由于您已经进行了重新分配,并且正在返回被删除的元素,因此对free的调用毫无意义,而且在多种方式上都是非法的。内存已经被释放,但不仅如此,它从来都不是指针。

还应注意realloc的哪些参数有效。如果您的Pop函数“删除”了最后一个元素,您将尝试重新分配为零大小,这是不合法的。

而且无论如何,您都应该进行防御性检查,确保没有人试图从已经空的堆栈中弹出。

09-17 17:14