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

cochen348

cochen348

2016-02-19 09:07

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享基于C语言中段错误的问题详解吧。

当我在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型变量 这个应该是一个栈地址 内核已经把它映射到一个实际的物理页
你在这个基础上小幅度上下偏移地址.相应的都应该有物理地址与之映射.
自然没有问题.

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
基于C语言中段错误的问题详解

c语言中 基于随机函数的使用详解

编程语言 网络编程
c语言中 基于随机函数的使用详解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

解析C语言中位字段内存分配的问题

编程语言 网络编程
解析C语言中位字段内存分配的问题

C语言中#define与typedef的互换细节详解

编程语言 网络编程
C语言中#define与typedef的互换细节详解

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

基于C语言EOF与getchar()的使用详解

编程语言 网络编程
基于C语言EOF与getchar()的使用详解

C语言中trim的实现

C语言教程 C语言函数
C语言中trim的实现

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

C语言中#define与typedef的互换细节详解

C语言中#define与typedef的互换细节详解

基于C语言EOF与getchar()的使用详解

基于C语言EOF与getchar()的使用详解
下拉加载更多内容 ↓