写了栈的压入和弹出的程序,弹出里的free错了,说是内存释放的问题,请问为什么错了?

晓彤123 2015-12-24 12:14:41
typedef struct Node//节点类型
{
int data;
struct Node *pNext;

}NODE, *PNODE;
typedef struct Stack//栈
{
PNODE pTop;
PNODE pBottom;

}STACK,*PSTACK;
//声明
void init(PSTACK);//必须取地址为形参,残能改变其中的量
void push(PSTACK, int);
void traverse(PSTACK);
bool pop(PSTACK, int *);
bool empty(PSTACK);


int main(void)
{
STACK S;//STACK等价于struct STACK
int val;
init(&S);//初始化栈
push(&S, 1);
push(&S, 2);
push(&S, 3);
traverse(&S);

if (pop(&S, &val))//val是弹出的数字,要跨函数使用此内存就要传地址。
{
printf("出战成功%d\n", val);
}
else
{
printf("出战失败\n");
}
traverse(&S);

return 0;
}
void init(PSTACK pS)
{
pS->pTop = (PNODE)malloc(sizeof(PNODE));
if (NULL == pS->pTop)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
pS->pBottom = pS->pTop;
pS->pTop->pNext = NULL;
}
}

void push(PSTACK pS,int val)
{
PNODE pNew = (PNODE)malloc(sizeof(PNODE));//创建新节点
pNew->data = val;//幅值数据区
pNew->pNext =pS-> pTop;//指向顶端节点
pS->pTop = pNew;//修改顶端指针


}

void traverse(PSTACK pS)
{
PNODE p = pS->pTop;
while (p != pS->pBottom)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}

bool empty(PSTACK pS)
{
if (pS->pTop == pS->pBottom)
return true;
else
return false;
}
bool pop(PSTACK pS, int *pVal)//好、跨函数使用内存,传地址
{
if( empty(pS))
{
return false;
}
else
{
PNODE r = pS->pTop;//要释放内存,就要先把这个记下来
*pVal = r->data;
pS->pTop = r->pNext;//下移ptop
free(r);
r = NULL;//这里错了,怎么改?
return true;

}
}
...全文
63 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
晓彤123 2015-12-25
  • 打赏
  • 举报
回复
谢谢,明白了。。。。。
paschen 2015-12-24
  • 打赏
  • 举报
回复
通常free时出错都是应该你使用动态分配的内存时越界了,导致相关数据被破坏,在free的时候崩溃
northwesternwind 2015-12-24
  • 打赏
  • 举报
回复
节点申请内存大小不够:

PNODE pNew = (PNODE)malloc(sizeof(PNODE));//创建新节点
应该是采用NODE的大小

PNODE pNew = (PNODE)malloc(sizeof(NODE));//创建新节点

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧