c语言中段错误,请教:c语言段错误

在下在linux下编了一个简单的关于数据结构中"栈"的程序,编译一切正常,但是无法运行,而且提示是段错误,希望各位大侠客不吝赐教.

以下我将程序的大致思路贴出来,希望大家帮帮我分析一下,谢谢了.

#include

#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->topstack[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)

}

|

晕吧,你的PSTACK pp;是一个指针,没有分配内存的。

pp=(PSTACK)malloc(128*sizeof(STACK));

最后free掉

|

段错误,基本都是内存出错,也就是指针的问题,可能是指针越界,也可能是没有给指针分配空间,你程序中,非常明显的就是,你只声明了一个指针,但是,你却没有给这个指针分配空间,这样当然会出错。

linux下,分配空间,用g_malloc();释放空间用g_free();要方便一些。

还有就是楼上的,128*sizeof(STACK)这个表达式非常的危险,首先我不明白为什么要乘128,其次,这个表达式容易溢出,在这里,肯定溢出了。一般这个的表达式,会先将乘出来的结果放到左乘数中,在给等号左边的赋值,而常数一般用4个字节,sizeof(STACK)这个数比较大,乘出来结果溢出。

|

g_malloc()就是包装了malloc(),就是返回void *,

g_free(),忽略任何传给它的空指针

|

这里 addr不是声明为指针,而是一个结构变量,编译器知道这个结构的大小,所以也就自动给这个变量分配了空间。

但是指针就不一样了,编译器不可能知道你需要分配多大的空间,所以分配空间的事情,不可能由编译器自己完成,而需要写程序的人自己完成。

|

百度搜索:Linux core dump

或者去我的blog看看那个文章,gdb看一下core或者gdb走一下就知道了.

|

基础知识不过关,好好学习C和数据结构吧。。

|

内存错误多半由指针没有分配空间造成的

|

基础知识不过关

PSTACK pp是一个指针,没有分配内存的

|

跟你们高手学习中/。

|

很明显的错误嘛

栈结构指针还没分配内存

|

一看就是没分配空间。

还有函数有返回0,1时也用void来声明也是不好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值