段错误(坚持学习第1天)

参考:https://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html

段错误的定义

段错误是指程序尝试访问一段不可访问的内存。

常见段错误产生原因

产生段错误的原因主要有:

  • 解引用空指针
  • 访问不可访问的内存空间(如内核空间)
  • 访问不存在的内存地址
  • 试图写一个只读内存空间(如代码段)
  • 栈溢出(函数递归调用)
  • 使用未初始化的指针(定义时没有初始化或者已经回收)

1. 访问不存在的内存地址;

     #include<stdio.h>
     #include<stdlib.h>
     void main()
      {
          int *ptr = NULL;
          *ptr = 0;
      }

2. 访问系统保护的内存地址

  	#include<stdio.h>
	#include<stdlib.h>
	
	void main()
   {
     	   int *ptr = (int *)0;
       	   *ptr = 100;
 	}

3. 访问只读的内存地址;

    #include<stdio.h>
	#include<stdlib.h>
	#include<string.h>
	
	void main()
	 {
     	   char *ptr = "test";
     	   strcpy(ptr, "TEST");
	 }

4.栈溢出

	#include<stdio.h>
	#include<stdlib.h>
	
	void main()
	{
        	main();
	}

段错误信息的获取

几种查看段错误的发生信息的途径:

1 .dmesg
dmesg可以在应用程序crash掉时,显示内核中保存的相关信息。通过dmesg命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈指针地址、错误代码、错误原因等。
2 .-g
使用gcc编译程序的源码时,加上-g参数,这样可以使得生成的二进制文件中加入可以用于gdb调试的有用信息。
例:gcc -g -o test_dmesg test_dmesg.c

预防发生段错误注意事项

  1. 出现段错误时,首先应该想到段错误的定义,从它出发考虑引发错误的原因
  2. 在使用指针时,定义了指针后记得初始化指针,在使用的时候记得判断是否为NULL
  3. 在使用数组时,注意数组是否被初始化,数组下标是否越界,数组元素是否存在等
  4. 在访问变量时,注意变量所占地址空间是否已经被程序释放掉
  5. 在处理变量时,注意变量的格式控制是否合理等
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值