日期:2014-05-16  浏览次数:20706 次

请教:c语言段错误
在下在linux下编了一个简单的关于数据结构中 "栈 "的程序,编译一切正常,但是无法运行,而且提示是段错误,希望各位大侠客不吝赐教.
以下我将程序的大致思路贴出来,希望大家帮帮我分析一下,谢谢了.

#include   <stdio.h>
#define   MAXNUM   888      
    /*定义栈结构-顺序栈*/      
    typedef   struct
    {      
                    int       stack[MAXNUM];/*循序栈*/      
                    int       top;/*栈指针*/      
    }STACK,*PSTACK;
    /*栈的初始化*/      
    void       init_stack(PSTACK   head)
    {
                    head-> top=-1;
//                     return   0;
    }            
    /*入栈*/      
    void       push_stack(PSTACK   head,int   x)
    {
//                     if(head-> top> =MAXNUM-1)/*栈满,无法入栈*/
//                         return   0;
                    head-> stack[++head-> top]=x;
//                         return   1;  
    }
    /*出栈*/      
    void       pop_stack(PSTACK   head)      
    {      
//                     if(head-> top <0)/*空栈/
//                                     return   0;
                    return   head-> stack[head-> top--];
    }    

void   main(void)
{
PSTACK   pp;
init_stack(pp);
push_stack(pp,1);
push_stack(pp,2);
push_stack(pp,3);
pop_stack(pp)
pop_stack(pp)
pop_stack(pp)
}

------解决方案--------------------
百度搜索:Linux core dump
或者去我的blog看看那个文章,gdb看一下core或者gdb走一下就知道了.
------解决方案--------------------
晕吧,你的PSTACK pp;是一个指针,没有分配内存的。
pp=(PSTACK)malloc(128*sizeof(STACK));
最后free掉
------解决方案--------------------
段错误,基本都是内存出错,也就是指针的问题,可能是指针越界,也可能是没有给指针分配空间,你程序中,非常明显的就是,你只声明了一个指针,但是,你却没有给这个指针分配空间,这样当然会出错。
linux下,分配空间,用g_malloc();释放空间用g_free();要方便一些。
还有就是楼上的,128*sizeof(STACK)这个表达式非常的危险,首先我不明白为什么要乘128,其次,这个表达式容易溢出,在这里,肯定溢出了。一般这个的表达式,会先将乘出来的结果放到左乘数中,在给等号左边的赋值,而常数一般用4个字节,sizeof(STACK)这个数比较大,乘出来结果溢出。
------解决方案--------------------
基础知识不过关,好好学习C和数据结构吧。。
------解决方案--------------------
g_malloc()就是包装了malloc(),就是返回void *,
g_free(),忽略任何传给它的空指针
------解决方案--------------------
内存错误多半由指针没有分配空间造成的
------解决方案--------------------