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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值