当前位置:  编程技术>c/c++/嵌入式

基于C语言中段错误的问题详解

    来源: 互联网  发布时间:2014-10-13

    本文导语:  当我在linux下写c语言的时候经常会遇到段错误.所以就来细究一下. 段错误或段违规(segmentation violation)查看Expert C Programming(Peter Van Der Linden) Pg.156解释到段错误是由于内存管理单元(MMU)的异常所致,而该异常则通常是由于解除引用...

当我在linux下写c语言的时候经常会遇到段错误.
所以就来细究一下.
 
段错误或段违规(segmentation violation)
查看Expert C Programming(Peter Van Der Linden) Pg.156
解释到段错误是由于内存管理单元(MMU)的异常所致,
而该异常则通常是由于解除引用一个未初始化或非法的指针引起.

就是指针正在引用一个并不位于你的地址空间中的地址.
书中的例子

代码如下:

int *p = 0; 
*p = 17; 

这里显然 地址0 并不是你程序所在的地址空间 所能得到的
而我在试验的时候 几乎随便给个地址 都是段错误
这也很正常,在运行之前是很难知道系统给你分配的地址空间的.
 
于是我这样测试了一下
代码如下:

int *p = 0; 
 int a = 7; 

 printf("a addr is %dn",&a); 
 scanf("%ld",&p); 

 printf("%d",*p);

由于 变量a的地址肯定在系统给你的程序所分配的地址空间内
所以你按照a的地址 给p赋值
或者小数目的向上下移4的整数倍 都是没问题的
经测试 并无段错误

分析了一下原因
在linux中,当你malloc一段内存的时候 只是拿到了 这段内存的虚拟地址.而这段虚拟地址也名没有实质的映射到物理地址.
而只有当你使用这段内存的时候.系统会申请相应页表映射到相应的物理地址.
而*p直接随意指向一个虚拟地址  而这个虚拟地址并没有实际的物理地址与之映射.
这时候解引用会在MMU发出异常,返回到linux就会给用户报一个段错误.
而如果你定义1个int型变量 这个应该是一个栈地址 内核已经把它映射到一个实际的物理页
你在这个基础上小幅度上下偏移地址.相应的都应该有物理地址与之映射.
自然没有问题.

以上都是自己的个人理解.可能还有不足的地方.
欢迎大家交流指教!

    
 
 

您可能感兴趣的文章:

  • sql语言中delete删除命令语句详解
  • 汇编语言rep movsd 的使用详解
  • 基于C语言fflush()函数的使用详解
  • C语言位图算法详解 iis7站长之家
  • C语言中堆空间的生成与释放详解
  • 深入c语言continue和break的区别详解
  • C语言中#define与typedef的互换细节详解
  • C语言循环队列的表示与实现实例详解
  • 关于c语言的一个小bug详解
  • C语言单链队列的表示与实现实例详解
  • Android笔记之:深入为从右向左语言定义复杂字串的详解
  • C语言中判断int,long型等变量是否赋值的方法详解
  • 关于C语言指针赋值的问题详解
  • C语言高斯消元法的使用详解
  • C语言栈的表示与实现实例详解
  • 深入C语言内存区域分配(进程的各个段)详解
  • c语言中 基于随机函数的使用详解
  • 深入分析C语言中结构体指针的定义与引用详解
  • C语言位图算法详解
  • c语言stack(栈)和heap(堆)的使用详解
  • 如何检查c语言的错误?
  • C 语言内存错误检测工具 memwatch
  • c语言出现以下错误提示请问如何解决
  • 莫名其妙的C语言错误
  • 如何解决curses.h下erase(void) 和aCC下的C++语言erase(iterator it);编译重名错误问题
  • linux下C语言连接mysql数据库编程,如何捕获错误?
  • 函数传入参数个数错误,C语言警告都不报一个?
  • C语言程序提示段错误
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • IIS报在服务器上找不到脚本语言'VBScript.encode'错误解决方法
  • 请教:c语言段错误
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 一个小问题。Linux下编程语言的问题。
  • 请教UNIX下编程语言的选择问题
  • freeBSD下语言的选型问题的请教
  • 初装RedHat9.0,关于语言安装的问题请教
  • SuSE 9.3语言问题
  • 关于以English默认语言登录的 中文输入法的问题
  • 请问在UNIX系统下C语言中的数据类型转换的问题
  • 请教C语言问题
  • c语言的.c和.h问题
  • redhat的语言安装的问题
  • !关于计算机及语言发展的问题
  • 安装linux9我选择系统语言一直为English,上网后不能显示中文的问题!
  • expect语言大批量非交互修改密码问题
  • 安装了red hat的系统语言问题
  • C语言 float问题
  • 现在我用c语言在linux下写一个服务端程序现发现了内存泄漏问题
  • C语言中函数声明与调用问题
  • 关于sql查询语言的一个问题!
  • 菜鸟问题——其他语言怎样使用Java编写的程序(明确地说,使Class)
  • 请问在linux下的c语言中如何删除由tmpfile()函数创建的临时问题
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • C语言中间语言 CIL
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3