segment fault 段错误 (core dumped)的起因分析!

很久一致被这个问题,这里试着去理解理解,首先写一个程序:

int main()
{
     int *p=(int *)malloc(0);
     *p=10;
     printf("%p/n",p);

    sleep(100);

     printf("%d/n",getpid());


     p=(int *)0x847e008;
     *p=20;
     return 0;
}

 

[qiqi@localhost test]$ ./hello
0x9f9e008
段错误 (core dumped)
[qiqi@localhost test]$

 

产生段错的根本的原因,首先要理解进程的地址空间,这里找到来一篇关于进程地址空间的好文章:

Linux进程地址空间




内核使用内存描述符结构体表示进程的地址空间,该结构体包含了和进程地址空间有关的全部信息。内存描述符由mm_struct结构体表示,定义在文件<linux/sched.h>中。进程地址空间由每个进程的线性地址区(vm_area_struct)组成。通过内核,进程可以给自己的地址空间动态的添加或减少线性区域。如下图是内存描述符mm_struct和线性区域描述 符vm_area_struct的关系:

      mm_users域记录正在使用该地址的进程数目。比如,如果两个进程共享该地址空间,那么mm_users的值便等于2;mm_count域是mm_struct的结构体的主引用计数,只要 mm_users不为0,那么mm_count值就等于1.当mm_users值减为0(两个线程都退出)时,mm_count域的值才变为0。如果mm_count的值等于0,说明已经没有任何指向该mm_struct结构 体的引用了,这时该结构体会被销毁。mmap和mm_rb这两个不同的数据结构描述的对象

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值