您的位置:首页 > 其它

ubuntu C 语言 段错误 (核心已转储)

2012-12-22 23:08 411 查看
一 般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指 向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的 表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了 越界访问,cpu就会产生相应的异常保护,于是segmentation
fault就出现了. 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的

1)访问系统数据区,尤其是往 系统保护的内存地址写数据 最常见就是给一个指针以0地址

2)内存越界(数组越界,变量类型不一致等

3) 访问到不属于你的内存区域

这是我程序

#include <stdio.h>
#include <string.h>

int main()
{
char s1[100]={0};
char s2[20];
char *p=NULL,cl;//如果此处*p为空,就会引起断错误
int i=0;
int a=0,b=0,len=0,k;
printf("input the string NO\n");
scanf("%i",&i);
printf("the NO is %d\n",i );
k=i;
for(;i>0;i--)
{
scanf("%s",s2);
cl = getchar();
len = strlen(s1);
printf("%d\n",len );
if(len!=0)
{
s1[len]=cl;
s1[len+1]='\0';
}
strcat(s1,s2);
}

printf("string input over\n" );
printf("%s\n",s1);

for (;k>0;k--)
{
p=strchr(s1,cl);
len=p-s1;
s1[len] = ' ' ;//此处 为空格
printf("%d\n",len);
printf("the string is %s\n",s1 );

}
}
使用GDB调试



可以看到很明显的错误行,使用bt命令:



可以判断是stack出错了,用反汇编



百度一把,看了别人的方法判断,我的某个指针初始化,出现了野指针。把*p=NULL,就好了。

但是我还是不太明白,怎么发现。

早上起来接着调试,中午吃完午饭,看了gdb手册,有所发现,使用单步调试



可以看到到第二次循环时,len乱了,P指针也指向了0,这个在Linux是受保护的。错误完全定位了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐