首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

请问:c语言段异常

2012-03-27 
请教:c语言段错误在下在linux下编了一个简单的关于数据结构中 栈 的程序,编译一切正常,但是无法运行,而

请教: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(),忽略任何传给它的空指针
[解决办法]
内存错误多半由指针没有分配空间造成的
------解决方案--------------------


基础知识不过关
PSTACK pp是一个指针,没有分配内存的
[解决办法]
跟你们高手学习中/。
[解决办法]
很明显的错误嘛
栈结构指针还没分配内存
[解决办法]
这里 addr不是声明为指针,而是一个结构变量,编译器知道这个结构的大小,所以也就自动给这个变量分配了空间。
但是指针就不一样了,编译器不可能知道你需要分配多大的空间,所以分配空间的事情,不可能由编译器自己完成,而需要写程序的人自己完成。
[解决办法]
一看就是没分配空间。
还有函数有返回0,1时也用void来声明也是不好的。

热点排行
Bad Request.