首页 > 用户发贴区 > 编程问题提问区 > 帮忙看看程序有啥问题(链栈的实现)
2009
10-21

帮忙看看程序有啥问题(链栈的实现)

以下程序是对链栈的简单实现;编译能通过,但运行提示段错误!调试了很久也没查出原因,可怜偶这小菜鸟了,望各位
大虾指点迷津,小弟在此先谢过!欢迎各位讨论。代码如下:
 
注:编译环境为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;
}

 bennysu2009-10-21 19:13:03


帮忙看看程序有啥问题(链栈的实现)》有 1 条评论

  1. bennysu 说:

    问题在两个热心朋友的帮助下解决了!修改后的代码如下:
    #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发现以下资料:

    **********************************************************************************************************************************

    (1)官方说法是: SIGSEGV —
    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(栈溢出)的问题。但为什么会发生溢出呢?怎样避免溢出呢?

    bennysu2009-10-22 14:58:40

留下一个回复