很久一致被这个问题,这里试着去理解理解,首先写一个程序:
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_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这两个不同的数据结构描述的对象