当前位置: 技术问答>linux和unix
请教:c语言段错误
来源: 互联网 发布时间:2016-02-26
本文导语: 在下在linux下编了一个简单的关于数据结构中"栈"的程序,编译一切正常,但是无法运行,而且提示是段错误,希望各位大侠客不吝赐教. 以下我将程序的大致思路贴出来,希望大家帮帮我分析一下,谢谢了. #include #define MAXN...
在下在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)
}
以下我将程序的大致思路贴出来,希望大家帮帮我分析一下,谢谢了.
#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掉
pp=(PSTACK)malloc(128*sizeof(STACK));
最后free掉
|
段错误,基本都是内存出错,也就是指针的问题,可能是指针越界,也可能是没有给指针分配空间,你程序中,非常明显的就是,你只声明了一个指针,但是,你却没有给这个指针分配空间,这样当然会出错。
linux下,分配空间,用g_malloc();释放空间用g_free();要方便一些。
还有就是楼上的,128*sizeof(STACK)这个表达式非常的危险,首先我不明白为什么要乘128,其次,这个表达式容易溢出,在这里,肯定溢出了。一般这个的表达式,会先将乘出来的结果放到左乘数中,在给等号左边的赋值,而常数一般用4个字节,sizeof(STACK)这个数比较大,乘出来结果溢出。
linux下,分配空间,用g_malloc();释放空间用g_free();要方便一些。
还有就是楼上的,128*sizeof(STACK)这个表达式非常的危险,首先我不明白为什么要乘128,其次,这个表达式容易溢出,在这里,肯定溢出了。一般这个的表达式,会先将乘出来的结果放到左乘数中,在给等号左边的赋值,而常数一般用4个字节,sizeof(STACK)这个数比较大,乘出来结果溢出。
|
g_malloc()就是包装了malloc(),就是返回void *,
g_free(),忽略任何传给它的空指针
g_free(),忽略任何传给它的空指针
|
这里 addr不是声明为指针,而是一个结构变量,编译器知道这个结构的大小,所以也就自动给这个变量分配了空间。
但是指针就不一样了,编译器不可能知道你需要分配多大的空间,所以分配空间的事情,不可能由编译器自己完成,而需要写程序的人自己完成。
但是指针就不一样了,编译器不可能知道你需要分配多大的空间,所以分配空间的事情,不可能由编译器自己完成,而需要写程序的人自己完成。
|
百度搜索:Linux core dump
或者去我的blog看看那个文章,gdb看一下core或者gdb走一下就知道了.
或者去我的blog看看那个文章,gdb看一下core或者gdb走一下就知道了.
|
基础知识不过关,好好学习C和数据结构吧。。
|
内存错误多半由指针没有分配空间造成的
|
基础知识不过关
PSTACK pp是一个指针,没有分配内存的
PSTACK pp是一个指针,没有分配内存的
|
跟你们高手学习中/。
|
很明显的错误嘛
栈结构指针还没分配内存
栈结构指针还没分配内存
|
一看就是没分配空间。
还有函数有返回0,1时也用void来声明也是不好的。
还有函数有返回0,1时也用void来声明也是不好的。