我是靠谱客的博主 仁爱自行车,最近开发中收集的这篇文章主要介绍ubuntu C 语言 段错误 (核心已转储),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一 般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由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 NOn");
scanf("%i",&i);
printf("the NO is %dn",i );
k=i;
for(;i>0;i--)
{
scanf("%s",s2);
cl = getchar();
len = strlen(s1);
printf("%dn",len );
if(len!=0)
{
s1[len]=cl;
s1[len+1]='';
}
strcat(s1,s2);
}
printf("string input overn" );
printf("%sn",s1);
for (;k>0;k--)
{
p=strchr(s1,cl);
len=p-s1;
s1[len] = ' ' ;//此处 为空格
printf("%dn",len);
printf("the string is %sn",s1 );
}
}
使用GDB调试


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

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


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

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

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


可以看到到第二次循环时,len乱了,P指针也指向了0,这个在Linux是受保护的。错误完全定位了。

最后

以上就是仁爱自行车为你收集整理的ubuntu C 语言 段错误 (核心已转储)的全部内容,希望文章能够帮你解决ubuntu C 语言 段错误 (核心已转储)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部