Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828393
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: C/C++

2012-11-09 10:27:23

这个问题其实困扰我很久了,我问很多人"NULL"是什么?有啥用?

大多数人的回答是:"NULL就是系统定义特殊的0,把你初始化的指针指向它,可以防止“野指针”的恶果。"
今天碰到一个C语言的笔试题,还是一道不错的题~~~
  1. #include   
  2. void fun(int *node)  
  3. {  
  4.     static int N=100;  
  5.     node=&N;  
  6. }  
  7. int main()  
  8. {  
  9.     int *node=NULL;  
  10.     int a=0;  
  11.     fun(node);  
  12.     a=*node;  
  13.     printf("%d\n",a);  
  14.       
  15.     return 0;  
  16. }  

请回答,以上这题的输出结果啥?

从结果中,这题可以区别出对C语言掌握的几个程度。那结果是:100?0?段错误退出?哪一句导致的?为什么?
认为是第一个结果人其实是被static这个关键词欺骗的,但是static是对N的修饰,表示对N的改变不会在fun函数的‘}’之后被释放掉~~~还有一个点就是:C语言的函数永远是值传递(除了数组,呵呵~~~),所以你想改变指针的指向(地址值),就必须传递指针的指针,除非你用return~~~
认为是第二个结果的人掌握了第一个结果的点,并且知道在C语言里是那样定义NULL的:
  1. #undef NULL  
  2. #if defined(__cplusplus)  
  3. #define NULL 0  
  4. #else  
  5. #define NULL ((void *)0)  
  6. #endif  
但是gcc下发现却是段错误退出了~~~
问题在这句:
  1. a=*node;   
  1. /*对node进行*运算,node此时木有改变的,还是(void *)0指针~~~所以段错误就出来,当然你可以读取NULL本身的值,即0,但是读取它指向的值,那是非法的,会引发段错误(貌似这种指针的错误还有:操作系统限制用户访问的地址空间,内存木有分到的地址空间(几百KB的嵌入式系统中普遍存在),再加这种就有三种,当然野指针也可能乱指到一般用户合法的地址,然后就乱改,然后就失控了~~~)*/  
NULL是个好东西,给一出生的指针一个安分的家~~~
ps:我一开始就以为是0,功力不深啊~~~修炼,修炼~~~
To Be Continued~~~
原文地址:
阅读(814) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~