NULL定义
NULL就是系统定义特殊的0,把初始化的指针指向它,可以防止“野指针”的恶果。
C语言宏定义NULL
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
c语言中NULL表示内存位置0,NULL((void
*)0)指针并不指向任何对象。因此除非是用于赋值或比较运算,出于其他任何目的使用NULL指针都是非法的。
注意:在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"
函数参数值传递及指针传值错误
#include
void fun(int *node)
{
static int N=100;
node=&N;
}
int main()
{
int *node=NULL;
int a=0;
fun(node);
a=*node;
printf("%d\n",a);
return 0;
}
结果是:100?0?段错误退出?
100:static是对N的修饰,表示对N的改变不会在fun函数的‘}’之后被释放掉。
0:C语言的函数永远是值传递(除数组),想改变指针的指向(地址值),就必须传递指针(C++可以传引用)的指针,除非用return
段错误:a=*node;对node进行*运算,node此时没有改变的,还是(void
*)0指针,所以段错误就出来,可以读取NULL本身的值,即0,但读取它指向的值,那是非法的,会引发段错误(指针的错误还有:操作系统限制用户访问的地址空间,内存木有分到的地址空间(几百KB的嵌入式系统中普遍存在),再加这种就有三种,当然野指针也可能乱指到一般用户合法的地址,然后就乱改,程序就失控了)*/
指针初始化
int *iPtr1 = NULL;
int *iPtr2 = 0;
//error: invalid conversion from `int' to
`int*'
int *iPtr3 = 1;
//error: invalid conversion from `void*'
to `int*'
int *iPtr4 = ((void* )0);
NULL具体应用场合
第一:指针初始化
例如 int *x = NULL;
第二:做比较运算,当函数返回值为指针时,判断函数是否返回成功。
FILE * pFile;
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL) printf("open
error");
第三:判断字符串是否为空字符串(做比较运算)。
if(str==NULL)或者if(str[0]=='\0') 就是空
野指针
void swap( int* p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access
Violation”。
正确程序应该改为:
swap( int* p1,int* p2 )
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}