Signal received: SIGSEGV

场景:Program received signal SIGSEGV, Segmentation fault.解决办法

Program received signal SIGSEGV, Segmentation fault.
本帖最后由 u013921360 于 2014-03-06 16:26:58 编辑
我编程序时遇到一个百思不得姐的问题,大家不必了解程序的内容,只需要追踪错误就可以了,大概意思就是按照模板格式化数字字符串并输出。
错误内容就是程序每次执行到*pattern=fill时就会Program received signal SIGSEGV, Segmentation fault.以下是代码:
main.c:
int main(void)
{
    char *pattern="*#,###";
    char const *digits="1234";
    char *pt=edit(pattern,digits);
    printf("%c  %s\n",*pt,pattern);
    return 0;
}


1.h:
char *edit(char *pattern,char const *digits);


1.c:(关键
#include "1.h"
#include <stdlib.h>
#define TRUE    1
#define FALSE   0
char *edit(char *pattern,char const *digits)
{
    char *pt=pattern;
    char *pattern_start=pattern;
    int signif=FALSE;
    char fill=*pattern;
    if(pattern==NULL||digits==NULL)
        return NULL;
    while(*pattern!='\0')
    {
        if(*pattern=='#')
        {
            if(*digits=='\0')
            {
                *pattern='\0';
                return pt;
            }
            if(signif==FALSE)
            {
                if(*digits=='0'||*digits==' ')
                    *pattern=fill;
                else
                {
                    *pattern=*digits++;
                    signif=TRUE;
                    pt=pattern;
                }
            }
            if(signif==TRUE)
                *pattern=*digits++;
        }
        else if(*pattern=='!')
        {
            if(*digits=='\0')
            {
                *pattern='\0';
                return pt;
            }
            if(signif==FALSE)
            {
                *pattern=*digits++;
                signif=TRUE;
                pt=pattern;
            }
            if(signif==TRUE)
                *pattern=*digits++;
        }
        else
        {
            if(signif==FALSE)
                *pattern=fill;
            else
                ;
        }
        pattern++;
    }
    pattern=pattern_start;
    return pt;
}


------解决方案--------------------
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core或core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令