源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-02-24 18:19 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:基于C语言中段错误的问题详解
当我在linux下写c语言的时候经常会遇到段错误. [b]所以就来细究一下. [/b]  段错误或段违规(segmentation violation) 查看Expert C Programming(Peter Van Der Linden) Pg.156 解释到段错误是由于内存管理单元(MMU)的异常所致, 而该异常则通常是由于解除引用一个未初始化或非法的指针引起. 就是指针正在引用一个并不位于你的地址空间中的地址. [b]书中的例子 [/b]
[u]复制代码[/u] 代码如下:
int *p = 0;  *p = 17; 
这里显然 地址0 并不是你程序所在的地址空间 所能得到的 而我在试验的时候 几乎随便给个地址 都是段错误 这也很正常,在运行之前是很难知道系统给你分配的地址空间的. [b]  于是我这样测试了一下 [/b]
[u]复制代码[/u] 代码如下:
int *p = 0;   int a = 7;   printf("a addr is %d\n",&a);   scanf("%ld",&p);   printf("%d",*p);
由于 变量a的地址肯定在系统给你的程序所分配的地址空间内 所以你按照a的地址 给p赋值 或者小数目的向上下移4的整数倍 都是没问题的 经测试 并无段错误 [b]分析了一下原因 [/b]在linux中,当你malloc一段内存的时候 只是拿到了 这段内存的虚拟地址.而这段虚拟地址也名没有实质的映射到物理地址. 而只有当你使用这段内存的时候.系统会申请相应页表映射到相应的物理地址. 而*p直接随意指向一个虚拟地址  而这个虚拟地址并没有实际的物理地址与之映射. 这时候解引用会在MMU发出异常,返回到linux就会给用户报一个段错误. 而如果你定义1个int型变量 这个应该是一个栈地址 内核已经把它映射到一个实际的物理页 你在这个基础上小幅度上下偏移地址.相应的都应该有物理地址与之映射. 自然没有问题. 以上都是自己的个人理解.可能还有不足的地方. 欢迎大家交流指教!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部