zoukankan      html  css  js  c++  java
  • c程序中出现segment error 和 bus error 的原因

     

    在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下

    • 段错误:
      1. 对一个NULL指针解引用。
      2. 访问程序进程以外的内存空间。

      实际上,第一个原因可以规约到第二个原因,在一个c程序的虚拟内存空间中,从低地址到高地址一次是代码区,堆区(向上增长),栈区(向下增长),最上是常量区,其中NULL指针的位置正好是虚拟内存中地址为0的位置,而这个位置是不属于以上4个区域的,同理一些比较低的地址也不属于这四个区,所以造成段错误的原因是访问了程序虚拟内存空间4个区以外的地址,在平时的开发中,最大的可能还是对NULL进行了解引用。

    • 总线错误
      1. 对一个错误的起始地址进行解引用

      由于进程的虚拟内存空间实际上是对物理地址的一个映射,操作系统和编译器会用内存对齐来做优化,通常就是4字节对齐,所以int,float这种类型的起始地址都是4的倍数,而short的起始地址是2的倍数,double的起始地址是8的倍数,假如此时对一个不是4倍数的地址a进行解引用 (int *) a,就可能会出现总线错误,这个出现的情况还要具体看是哪一种操作系统。总线错误一般不会出现,出现的情况多半是使用了指针的强制转换。

    转自

    http://transcoder.baidu.com/from=1086k/bd_page_type=1/ssid=0/uid=0/pu=usm%401%2Csz%40224_220%2Cta%40iphone___3_537/baiduid=CD36111FEA588A3E401AA4880A8FDE82/w=0_10_c+bus+error/t=iphone/l=3/tc?ref=www_iphone&lid=16572230499935529550&order=1&fm=alop&tj=www_normal_1_0_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&title=c%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%87%BA%E7%8E%B0segmenterror%E5%92%8Cbuserror%E7%9A%84%E5%8E%9F..._%E5%8D%9A%E5%AE%A2%E5%9B%AD&dict=30&sec=14407&di=9ed78506558585c4&bdenc=1&tch=124.1470986504959.65.182.1.550&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRASi4hMW0TUS4dgTCcshk1wXWj_XhunM5X&eqid=e5fc63d6148d28001000000257ad7906&wd=&clk_info=%7B%22srcid%22%3A%22www_normal%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1470986505829%2C%22xpath%22%3A%22div-a-h3%22%7D

  • 相关阅读:
    怎么查看京东店铺的品牌ID
    PPT编辑的时候很卡,放映的时候不卡,咋回事?
    codevs 1702素数判定2
    codevs 2530大质数
    codevs 1488GangGang的烦恼
    codevs 2851 菜菜买气球
    hdu 5653 Bomber Man wants to bomb an Array
    poj 3661 Running
    poj 1651 Multiplication Puzzle
    hdu 2476 String Painter
  • 原文地址:https://www.cnblogs.com/ncgds/p/5765116.html
Copyright © 2011-2022 走看看