段错误概念及种类

1.什么是段错误(segmentation fault)?        

        段错误是指访问的内存超出了系统给的这个程序设定的内存空间,也就是访问非法内存

2.什么是core文件?

        当错误发生时,操作系统会吧程序需crash时的内存dump出来,并保存到一个core文件中

3.段错误的分类:

        a.往系统保护的内存地址写数据

#include <stdio.h> int main (void){    int *ptr = (int *)0;    *ptr = 100;    return 0;}输出结果:段错误(核心已转储)

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

#include <stdio.h>
int main (void)
{
    char test[10];
    printf ("%c\n", test[100000]);
    return 0;
}输出结果:段错误(核心已转储),我将字符串转换为字符数组的时候出现了这个错误,char a[] 括号类的值要大于等于string.size()就好了

        c.访问不存在的内存地址

#include <stdio.h> int main (void){    int *ptr = NULL;    *ptr = 0;    return 0;}输出结果:段错误(核心已转储)

        d.访问只读的内存 

#include <stdio.h>#include <string.h> int main (void){    char *ptr = "test";    strcpy (ptr, "TEST");    return 0;}输出结果:段错误(核心已转储)

        e.访问废弃的指针,指悬空指针,或者给指向null的指针赋值

#include <stdio.h> int main (void){    int *ptr = NULL;    printf ("%d\n", *ptr);    return 0;}输出结果:段错误(核心已转储)

               还有,比如malloc 动态分配内存,释放、置空完成后,不可再使用该指针。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 int main()
{    
    char* str=(char* )malloc(100);   
    if(*str)  
  {  
      return;  
  }   
    strcpy(str,"hello");   
    printf("%s\n",str);   
    free(str);    
    str=NULL;  
    strcpy(str,"abcdef");
    return 0;
}输出结果:hello段错误 (核心已转储)

        f.堆栈溢出导致的段错误

        

#include <stdio.h>
#include <string.h>
int main (void)
{    
    main ();
    return 0;
}输出结果:段错误(核心已转储)

   

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值