| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1774 人关注过本帖
标题:用C写的链栈,出栈的时候释放内存出错?请求帮助
只看楼主 加入收藏
乱丶心
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-4-27
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:6 
用C写的链栈,出栈的时候释放内存出错?请求帮助
这个程序主要的部分写完了,能初始化,能入栈,能释放所有内存,但是在出栈的时候,释放s->top的时候却不行,请问是为什么呢?
还是因为我程序写错了,请指教。

Stack.h
程序代码:
#ifndef STACK_H
#define STACK_H

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

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int SElemType;
typedef int Status;
//初始化结构
typedef struct StackNode{
    SElemType data;
    struct StackNode* next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack {
    StackNode* top;
    int count;
}LinkStack;


//初始化操作,建立一个空栈
LinkStack* InitStack();
//将栈清空
void ClearStack(LinkStack *s);
//销毁
void DestoryStack(LinkStack *s);
//若栈为空,返回TRUE,否则返回false
Status IsEmpty(LinkStack s);
//若栈存在且非空,用e返回S的栈顶元素
void GetTop(LinkStack s, SElemType *e);
//插入元素e为新的栈顶元素
Status Push(LinkStack *s, SElemType e);
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
Status Pop(LinkStack *s, SElemType *e);
//返回栈S的元素个数
Status StackLength(LinkStack *s);

//打印
void PrintfStack(LinkStack *s);

#endif





Stack.c

程序代码:
#include"Stack.h"

//初始化操作,建立一个空栈
LinkStack* InitStack() {
    LinkStack *s = (LinkStack*)malloc(sizeof(LinkStack));
    s->count = 0;
    s->top = (StackNode*)malloc(sizeof(StackNode));
    s->top->data = NULL;
    s->top->next = NULL;
    return s;
}
//将栈清空
void ClearStack(LinkStack *s) {


}
//销毁
void DestoryStack(LinkStack *s) {
    if (s == NULL) {
        return;
    }
    LinkStackPtr p;
    p = s->top;//将栈顶结点赋值给p
    while (p == NULL) {
        LinkStackPtr pNext = p->next;
        free(p);//释放结点p
        p = pNext;
    }
    s->count = 0;
    free(s);
}
//若栈为空,返回TRUE,否则返回false
Status IsEmpty(LinkStack s) {
    if (s.top->next == NULL) {
        return TRUE;
    }
    return FALSE;
}
//若栈存在且非空,用e返回S的栈顶元素
void GetTop(LinkStack s, SElemType *e) {


}
//插入元素e为新的栈顶元素
Status Push(LinkStack *s, SElemType e) {
    LinkStackPtr a = (LinkStackPtr)malloc(sizeof(LinkStackPtr));
    a->data = e;
    a->next = s->top;//把当前的栈顶元素赋给新结点的直接后继
    s->top = a;//将新结点a赋值给栈顶指针
    s->count++;
    return OK;
}
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
Status Pop(LinkStack *s, SElemType *e) {
    StackNode* p;
    if (IsEmpty(*s)) {
        return ERROR;
    }
    *e = s->top->data;
    p = s->top;//将栈顶结点赋值给p
    printf("删除前s->top:%d\n", s->top->data);
    s->top = p->next;//使得栈顶指针下移一位,指向后一结点
    free(p);//释放结点p--------------主要问题就是这里。这里注释后运行无问题,但内存没释放
    printf("删除后结点释放后s->top:%d\n",s->top->data);
    s->count--;
    return OK;
}
//返回栈S的元素个数
Status StackLength(LinkStack *s) {
    
    int j = s->count;
    return j;
}

//打印
void PrintfStack(LinkStack *s) {
    if (s == NULL) {
        return;
    }
    LinkStackPtr pCurrent = s->top;
    for (int i = 0; i < StackLength(s);i++) {
        printf("%d ",pCurrent->data);
        pCurrent = pCurrent->next;
    }
    printf("\n");
}

main.c
程序代码:
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Stack.h"

int main()
{
    int m[] = { 13,24,45,46,68,78,98 };
    int n = 7;
    //初始化
    LinkStack* b = InitStack();
    SElemType e;
    printf("栈的长度为:%d \n", StackLength(b));
    //入栈
    for (int i = 0; i < n; i++) {
        Push(b, m[i]);
    }
    //打印
    printf("栈的长度为:%d \n", StackLength(b));
    PrintfStack(b);

    //出栈
    Pop(b, &e);//--------------

    //打印
    printf("栈的长度为:%d \n", StackLength(b));
    PrintfStack(b);

    //释放
    DestoryStack(b);

    printf("\n");
    system("pause");
    return 0;
}


搜索更多相关主题的帖子:  top 返回 元素 return 
2018-04-27 19:27
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
你是怎么知道它没有释放的?
2018-04-27 21:12
乱丶心
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-4-27
收藏
得分:0 
回复 2楼 yangfrancis
在运行的时候,如果把那里free去掉,栈就把那个p结点跳过了,指向了下一个结点,那个p结点就没用到,也没释放呀,加上fee(p),一运行就卡死在那了
2018-04-28 09:38
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 乱丶心
这个现象多说是内存溢出,修改了malloc块内部管理数据导致用free调用内部信息时发生异常~
通常malloc一般会在数据开头的前些位置记录了一些例如大小等状态信息(虽然我没有深入了解 但malloc毕竟是一个函数,具体实现方法还是要这样的),白盒实现说明完全可以通过malloc前部找到关键信息索引直接指向尾部,因此malloc尾部也是有可能有内容的(这或者是malloc实际可用内存大小会比申请空间要大些许的原因)

所以可以看看是否哪里存在越界了(就算是我有时也会遇到这些问题,多少有点无语)~

如果是运行free时立即出现问题那可能是上面我所说的情况,如果是free后进行其它操作出现问题或者是释放后指针没有及时指向NULL或者是其它原因,通常是那些内部逻辑架构和设计期望期有所偏差而出现问题的~

[此贴子已经被作者于2018-4-28 11:23编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-28 10:40
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
回复 3楼 乱丶心
LinkStackPtr a = (LinkStackPtr)malloc(sizeof(LinkStackPtr));

这里sizeof (LinkStackPtr)看看是多少,可以这样

LinkStackPtr a = (LinkStackPtr)malloc(sizeof(*LinkStackPtr));

~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-28 11:21
乱丶心
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-4-27
收藏
得分:0 
回复 5楼 九转星河
好的,我试试,谢谢
2018-04-28 12:46
乱丶心
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-4-27
收藏
得分:0 
回复 5楼 九转星河
我找到原因了,谢谢,
是我在插入元素的时候写错了
原来是: LinkStackPtr a = (LinkStackPtr)malloc(sizeof(LinkStackPtr));
改成 LinkStackPtr a = (LinkStackPtr)malloc(sizeof(StackNode));就可以了,
我在定义结构体的时候StackNode和LinkStackPtr是不一样的,谢谢
2018-04-28 12:59
快速回复:用C写的链栈,出栈的时候释放内存出错?请求帮助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020346 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved