以下程序是对链栈的简单实现;编译能通过,但运行提示段错误!调试了很久也没查出原因,可怜偶这小菜鸟了,望各位
大虾指点迷津,小弟在此先谢过!欢迎各位讨论。代码如下:
注:编译环境为debian linux 5.02+GCC 4.3.4
#include<stdio.h>
#include<stdlib.h>
/*定义结点类型*/
typedef struct{
int data;
struct SNODE *next;
}SNODE,*Snode_ptr;
void Init_slink(Snode_ptr);//初始化栈
void Push_slink(Snode_ptr,int);//进栈
int Pop_slink(Snode_ptr);//出栈
int Empty_slink(Snode_ptr);//判断空栈
int main(){
Snode_ptr top;
int a=5,b=2,c=3;
Init_slink(top);
Push_slink(top,a);
Push_slink(top,b);
Push_slink(top,c);
while(!(Empty_slink(top))){
printf(“%d “,top->next->data);
Pop_slink(top);
}
}
void Init_slink(Snode_ptr t){
t=(Snode_ptr)malloc(sizeof(SNODE));
t->next=NULL;
}
void Push_slink(Snode_ptr t,int n){
Snode_ptr p;
p=(Snode_ptr)malloc(sizeof(SNODE));
p->data=n;
p->next=t->next;
t->next=p;
}
int Pop_slink(Snode_ptr t){
Snode_ptr p;
int i;
p=(Snode_ptr)malloc(sizeof(SNODE));
p=t->next;
i=p->data;
t->next=p->next;
free(p);
return i;
}
int Empty_slink(Snode_ptr t){
if(t->next==NULL) return 1;
else return 0;
}
>> 本文固定链接: http://www.vcgood.com/archives/3292
问题在两个热心朋友的帮助下解决了!修改后的代码如下:
#include<stdio.h>
#include<stdlib.h>
//定义结点类型
typedef struct node{
int data;
struct node *next;
}Node,*Snode_ptr;
void Init_slink(Snode_ptr *);//初始化栈
void Push_slink(Snode_ptr *,int);//进栈
int Pop_slink(Snode_ptr *);//出栈
int Empty_slink(Snode_ptr *);//判断空栈
int main(){
Snode_ptr *top;
int a=5,b=2,c=3;
Init_slink(top);
Push_slink(top,a);
Push_slink(top,b);
Push_slink(top,c);
while(!(Empty_slink(top))){
printf(“%d “,Pop_slink(top));
}
}
void Init_slink(Snode_ptr *t){
*t=(Snode_ptr)malloc(sizeof(Node));
(*t)->next=NULL;
}
void Push_slink(Snode_ptr *t,int n){
Snode_ptr p;
p=(Snode_ptr)malloc(sizeof(Node));
p->data=n;
p->next=(*t)->next;
(*t)->next=p;
}
int Pop_slink(Snode_ptr *t){
Snode_ptr p;
int i;
p=(Snode_ptr)malloc(sizeof(Node));
p=(*t)->next;
i=p->data;
(*t)->next=p->next;
free(p);
return i;
}
int Empty_slink(Snode_ptr *t){
if((*t)->next==NULL) return 1;
else return 0;
}
小结:虽然修改后程序能达到预定目的。但原来写的函数究竟有啥问题呢?用GDB调试得到“Program received signal SIGSEGV, Segmentation fault.”的错误提示。
经google发现以下资料:
**********************************************************************************************************************************
Segment Fault. The possible cases of your encountering this error are:
1.buffer overflow — usually caused by a pointer reference out of
range. 2.stack overflow — please keep in mind that the default stack
size is 8192K. 3.illegal file access — file operations are forbidden
on our judge system.
(2)SIGBUS与SIGSEGV信号的一般区别如下:1) SIGBUS(Bus
error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。2) SIGSEGV(Segment
fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。
(3)Linux的mmap(2)手册页
————————————————————————–
使用映射可能涉及到如下信号SIGSEGV 试图对只读映射区域进行写操作SIGBUS
试图访问一块无文件内容对应的内存区域,比如超过文件尾的内存区域,或者以前有文件内容对应,现在为另一进程截断过的内存区域。
————————————————————————–
弄清楚错误以后,就要查找产生错误的根源,一般我用以下两种方法:
(1)gcc -g 编译 ulimit -c 20000 之后运行程序,等core dump 最后gdb -c core <exec file>
来查调用栈
(2)使用strace execfile,运行程序,出错时会显示那个系统调用错
*********************************************************************************************************************************
据此我估计应该是stack overflow(栈溢出)的问题。但为什么会发生溢出呢?怎样避免溢出呢?