在构建堆栈的过程中,我在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
函数“删除”了最后一个元素,您将尝试重新分配为零大小,这是不合法的。
而且无论如何,您都应该进行防御性检查,确保没有人试图从已经空的堆栈中弹出。