手机
当前位置:查字典教程网 >编程开发 >C语言 >基于C语言中段错误的问题详解
基于C语言中段错误的问题详解
摘要:当我在linux下写c语言的时候经常会遇到段错误.所以就来细究一下.段错误或段违规(segmentationviolation)查看Expe...

当我在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型变量 这个应该是一个栈地址 内核已经把它映射到一个实际的物理页

你在这个基础上小幅度上下偏移地址.相应的都应该有物理地址与之映射.

自然没有问题.

以上都是自己的个人理解.可能还有不足的地方.

欢迎大家交流指教!

【基于C语言中段错误的问题详解】相关文章:

基于一个简单定长内存池的实现方法详解

关于C语言指针赋值的问题详解

基于C语言char与unsigned char的区别介绍

C语言中宏定义使用的小细节

关于C++中0是十进制还是八进制的问题

基于排列与组合输出多少中情况详解

基于一致性hash算法 C++语言的实现详解

C++对象的动态建立与释放详解

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

c语言printf函数的使用详解

精品推荐
分类导航