| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1182 人关注过本帖
标题:【求助】编译没有提示错误,程序运行提示崩溃
只看楼主 加入收藏
wadeyu
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2016-3-22
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:7 
【求助】编译没有提示错误,程序运行提示崩溃
源代码如下:
程序代码:
#include <stdlib.h>
#include <stdio.h>

#define OK 1
#define ERROR 0
#define MAXSIZE 50

typedef int SElementType;
typedef int Status;
typedef struct{
    SElementType data[MAXSIZE];
    int top1;
    int top2;
}SqDoubleStack;

void InitStack(SqDoubleStack *S){
    S->top1 = -1;
    S->top2 = MAXSIZE;
}

Status Push(SqDoubleStack *S, SElementType e, int stackNumber){
    if( (S->top2 - S->top1) == 1 ){
        return ERROR;
    }
    if(stackNumber == 1){
        S->data[++S->top1] = e;
    } else if(stackNumber == 2) {
        S->data[--S->top2] = e;
    }
    return OK;
}

Status Pop(SqDoubleStack *S,SElementType *e, int stackNumber){
    if(stackNumber == 1){
        if(S->top1 == -1){
            return ERROR;
        }
        *e = S->data[S->top1];
        S->top1--;
    } else if (stackNumber == 2){
        if(S->top2 == MAXSIZE){
            return ERROR;
        }
        *e = S->data[S->top2++];
    }
    return OK;
}

int StackLength(SqDoubleStack *S){
    return (S->top1 + 1 + MAXSIZE - S->top2);
}

int main(){
    SqDoubleStack *S = NULL;
    //SElementType *e = NULL;
    int i = 0;
    int stackNumber = 1;
    Status sts = OK;
    S = (SqDoubleStack*)malloc(sizeof(SqDoubleStack));
    //e = (SElementType*)malloc(sizeof(SElementType));
    if((S == NULL) /*|| (e == NULL)*/){
        printf("malloc failure.");
        return 0;
    }
    for(i = 0; i < 10; i++){
        stackNumber = (i%2==0) ? 1 : 2;
        sts = Push(S,i+1,stackNumber);
        printf("push:%d,sts:%d,stackNumber:%d",i+1,sts,stackNumber);
    }
    printf("stack double length:%d",StackLength(S));
    return 0;
}


错误截图如下:
图片附件: 游客没有浏览图片的权限,请 登录注册

程序调试发现执行到下面这行代码崩溃了
图片附件: 游客没有浏览图片的权限,请 登录注册


上次也碰到崩溃问题,有大神指点是因为指针变量没有申请内存,这次检查了很多遍,发现有申请,不知道是哪里出问题了
搜索更多相关主题的帖子: 源代码 
2016-03-23 13:16
koma仔
Rank: 1
来 自:"><a>s</a
等 级:新手上路
帖 子:15
专家分:8
注 册:2015-3-9
收藏
得分:0 
加上括号
2016-03-23 13:22
wadeyu
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2016-3-22
收藏
得分:0 
回复 2楼 koma仔
哪个地方加上括号啊,请指点下哈
2016-03-23 13:31
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:20 
S->top1和S->top2没初始化。最好把整个S的内容初始化一下。
2016-03-23 13:50
luckhide
Rank: 5Rank: 5
来 自:青岛
等 级:职业侠客
帖 子:51
专家分:338
注 册:2016-3-19
收藏
得分:0 
个人感觉这句存在不确定性“S->data[++S->top1] = e;”,你说e到底最后是送进了s+1里还是s里呢?因为根据++s语法是要首先将s加1再使用的,代码不宜这样写。
至于崩溃肯定是指针为null了。
2016-03-23 14:03
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
typedef int SElementType;
typedef int Status;
借楼主的地方问下上面的两句没有问题嘛?不是很懂。
typedef的作用不是这个么:使用typedef为现有类型创建同义字,定义易于记忆的类型名;
上面两句都是把int定义为其他名字,不会冲突吗?
2016-03-23 14:03
wadeyu
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2016-3-22
收藏
得分:0 
回复 6楼 wanglianyi1
主要是为了理解方便,一看就知道函数的返回是啥,代码就能起到很好的注释作用
2016-03-23 21:01
wadeyu
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2016-3-22
收藏
得分:0 
回复 4楼 grmmylbs
确实初始化之后,程序不崩溃了,这个是为啥呢,我不是通过malloc分配了内存嘛,以前写脚本的,刚转到C上来。。。
2016-03-23 21:04
快速回复:【求助】编译没有提示错误,程序运行提示崩溃
数据加载中...
 
   



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

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