c语言指针为null 可以读吗,C语言(NULL及野指针)

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;

}

你可能感兴趣的:(c语言指针为null,可以读吗)