Signal received: SIGSEGV
场景:Program received signal SIGSEGV, Segmentation fault.解决办法
Program received signal SIGSEGV, Segmentation fault.
我编程序时遇到一个百思不得姐的问题,大家不必了解程序的内容,只需要追踪错误就可以了,大概意思就是按照模板格式化数字字符串并输出。
错误内容就是程序每次执行到*pattern=fill时就会Program received signal SIGSEGV, Segmentation fault.以下是代码:
main.c:
1.h:
1.c:(关键)
------解决方案--------------------
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core或core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
Program received signal SIGSEGV, Segmentation fault.
我编程序时遇到一个百思不得姐的问题,大家不必了解程序的内容,只需要追踪错误就可以了,大概意思就是按照模板格式化数字字符串并输出。
错误内容就是程序每次执行到*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文件最大块大小”命令