鱼C论坛

 找回密码
 立即注册
查看: 2246|回复: 17

堆栈初始化的问题

[复制链接]
发表于 2014-3-7 13:19:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sidfate 于 2014-3-7 17:02 编辑

代码如下:

#define STACK_INITSIZE 100
typedef  int  LX;
void initstack(stack *s)
{
s->bottom=(LX *)malloc(STACK_INITSIZE * sizeof(LX));     //调试到这里显示错误。错误如下图所示

if(!s->bottom)
  exit(0);

s->top=s->bottom;
s->stack_size=STACK_INITSIZE;
}



搜狗截图14年03月07日1317_1.png

求教是哪了错了。我照着小甲鱼给的写的=   =??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-7 19:04:39 | 显示全部楼层

回帖奖励 +3 鱼币

能给全代码么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 19:58:23 | 显示全部楼层
估计你的要求的地址范围超过windows系统的允许界限了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 14:04:11 | 显示全部楼层

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

#define STACK_INITSIZE 100
#define STACK_ADDSIZE  10

typedef int LX;
typedef struct
{
        LX *bottom;
        LX *top;
        int stack_size;
}stack;

void initstack(stack *s)
{
        s->bottom=(LX *)malloc(STACK_INITSIZE * sizeof(LX));
       
        if(!s->bottom)
                exit(0);
       
        s->top=s->bottom;
        s->stack_size=STACK_INITSIZE;
}

void push(stack *s,LX *e)
{
        if((s->top-s->bottom)>=s->stack_size)
        {
                s->bottom=(LX *)realloc(s->bottom,(s->stack_size+STACK_ADDSIZE)*sizeof(LX));
                if(!s->bottom)
                        exit(0);
                s->top=s->bottom+s->stack_size;
                s->stack_size=s->stack_size+STACK_ADDSIZE;
        }
        (*s->top)=*e;
        s->top++;
}


void pop(stack *s,LX *e)
{
        if(s->top==s->top)
                return;
        *e=*--(s->top);
}


int main()
{
        stack *s;
        int i;
        int a[100]={0},b[100]={1,2,3,4,5,6,7,8,9,10};
        initstack(s);
        push(s,b);
        pop(s,a);
        for(i=0;i<5;i++)
        {
                printf("%d  ",a[i]);
        }
        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 14:04:54 | 显示全部楼层
oggplay 发表于 2014-3-7 19:58
估计你的要求的地址范围超过windows系统的允许界限了

请看一下全代码:

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

#define STACK_INITSIZE 100
#define STACK_ADDSIZE  10

typedef int LX;
typedef struct
{
        LX *bottom;
        LX *top;
        int stack_size;
}stack;

void initstack(stack *s)
{
        s->bottom=(LX *)malloc(STACK_INITSIZE * sizeof(LX));
       
        if(!s->bottom)
                exit(0);
       
        s->top=s->bottom;
        s->stack_size=STACK_INITSIZE;
}

void push(stack *s,LX *e)
{
        if((s->top-s->bottom)>=s->stack_size)
        {
                s->bottom=(LX *)realloc(s->bottom,(s->stack_size+STACK_ADDSIZE)*sizeof(LX));
                if(!s->bottom)
                        exit(0);
                s->top=s->bottom+s->stack_size;
                s->stack_size=s->stack_size+STACK_ADDSIZE;
        }
        (*s->top)=*e;
        s->top++;
}


void pop(stack *s,LX *e)
{
        if(s->top==s->top)
                return;
        *e=*--(s->top);
}


int main()
{
        stack *s;
        int i;
        int a[100]={0},b[100]={1,2,3,4,5,6,7,8,9,10};
        initstack(s);
        push(s,b);
        pop(s,a);
        for(i=0;i<5;i++)
        {
                printf("%d  ",a[i]);
        }
        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 16:17:22 | 显示全部楼层
main()函数里改为:

int main()
{
        stack *s;
        s=(stack *)malloc(3 * 4);
        int i;
        int a[100]={0},b[100]={1,2,3,4,5,6,7,8,9,10};
        initstack(s);
        push(s,b);
        pop(s,a);
        for(i=0;i<5;i++)
        {
                printf("%d  ",a);
        }
        free(s->bottom);
        free(s);
        return 0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 17:31:22 | 显示全部楼层
在main()函数中     stack *s; s在这里是一个函数栈内的数据,是不确定的,可能指向任何内存段
而在调用nitstack(s);  中将s作为函数参数,进而对它指向的内存段进行修改,对于一些系统保护的内存则会发生错误。
建议
1.将stack *s 改为 stack s在函数调用中直接传递&s即可
2.或者stack *s后将s指向一段合法的内存段如堆内存或者栈内存。

在使用指针时一旦创建出来要么指向一段合法内存要么把它置为空指针NULL
希望对楼主有所帮助。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 17:46:27 | 显示全部楼层
优雅的独行者 发表于 2014-3-8 17:31
在main()函数中     stack *s; s在这里是一个函数栈内的数据,是不确定的,可能指向任何内存段
而在调用ni ...

谢谢很有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 17:46:59 | 显示全部楼层
zheyitian 发表于 2014-3-8 16:17
main()函数里改为:

int main()

确实可以!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 18:10:16 | 显示全部楼层
太给力了,楼主我看好你哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-9 11:41:50 | 显示全部楼层

回帖奖励 +3 鱼币

哈哈,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-9 12:48:23 | 显示全部楼层
恩恩,学习了,,,,,,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-9 12:49:15 | 显示全部楼层
额,以后再处理这方面的东西,看来我也要小心点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-14 00:33:02 | 显示全部楼层
不错不错,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-14 11:27:49 | 显示全部楼层
强大,学习了{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-13 15:58:49 | 显示全部楼层
鱼币鱼币~~~~~~~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-14 17:42:45 | 显示全部楼层
hehe,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-14 17:44:52 | 显示全部楼层

回帖奖励 +3 鱼币

hehe,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 22:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表