Chinaunix首页 | 论坛 | 博客
  • 博客访问: 464221
  • 博文数量: 68
  • 博客积分: 2606
  • 博客等级: 上尉
  • 技术积分: 1308
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-13 23:01
文章分类
文章存档

2012年(6)

2011年(62)

分类: LINUX

2011-11-16 14:46:52

------------------------------------------
本文为本人原创,欢迎转载!
转载请注明出处:snowboy.blog.chinaunix.net
雪夜流星
------------------------------------------
段错误是我们在运行程序是遇到的最频繁的错误,本人也经常遇到,现用一个例子来剖析这类错误,希望能够起到抛砖引玉的效果,先看一段代码:
  1. #include <stdio.h>

  2. int main(void)
  3. {

  4.         int *p;
  5.         p = (int *)0x0123456;
  6.         *p = 0x11;
  7.         printf("*p is %d", *p);
  8.         return 0;
  9. }
编译运行会产生段错误,什么原因呢?

大多数人都知道是因为没有给p分配合法空间,就直接给p指向的空间赋值会导致产生段错误。

但为何不给指针p分配合法的空间而直接往p指向的空间赋值就会产生段错误,内核是怎样做的呢?

很多人知其然,并不知其所以然,好奇心重的我并不满足于此。

下面是对该问题的一个参考答案:

上面那段代码是运行在用户空间的,每个进程都有自己的页表和页目录,操作系统没有为你设置页表让你访问0x0123456这个线性地址所在的页。page unit(页式管理单元)自然没办法帮你把这个线形地址翻译成物理地址,那就只好给你个page fault异常,然后内核就发送个段错误的信号给你的进程!(如需更深的答案,且看ulk3第九章)。

阅读(4507) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

liupan99992013-05-22 16:35:41

如果这样,先定义一个指针,然后输出它的指向
int main()
{
 int* Pint;
        printf("Pint point to: %p\n",Pint);

接着从键盘输入上面输出的内存地址赋值给Pint,不知能否成功赋值?