空指针
c语言中*P=NULL的作用
书上说NULL对暂时不用的指针变量赋初值
如 int *p=NULL
但书上又说企图用*p=5给p所指向的存储单元赋值,则系统将给用户一个错误信息
为什么呢?
赋初值之后想用到这个指针变量了 想赋5 哪里不可行了?我这里没弄懂
答:p 是个指针,指针是指向一个地址的,地址里面存放的才是值,int *p=NULL,意思是虽然给*p本身分配了一个空间但是p本身没有指向一个确定的地址。可能是栈上的一个地址,也可能是静态数据区,还可能是系统核心数 据区 。更不要说地址里面的值了,如果你程序里想让P指向一个值,先得让他指向一个地址,比如说 int *p=&a 意思是给P分配了一个整型长度内存空间a,就是说给他分配了一个地址空间,然后再给这个地址赋值*p=5;就可以了。
指针就是表示的内存地址,比 如一个指针为5000,表示它指向内存中第5000个字节位置,如果一个指针为0,表示它指向内存中第0个字节位置(计算机中内存的编号是从0开始 的).NULL在很多种语言中定义为0,当一个指针为NULL时,或者我们给一个指针赋值为NULL时,它就指向了第0个编号的内存地址,此时,这个指针 和所指向的内存单元是有意义的,但是,基本上所有的操作系统中,第0个字节的内存都是处于存放系统内核的区域内的,是不能让用户直接访问和读写的,所以, 使用一个值为NULL的指针(即它指向第0字节的内存)会产生如:"XXX所引用的内存地址0X0000不能为READ"之类的错误.这个错误是操作系统 的保护机制在起作用.这也就是说NULL值不一定要定义成0,起始只要定义在系统的保护范围的地址空间内,比如定义成(0x00000001, 0x00000002)都会起到相同的作用,但是为了考虑到移植性,普遍定义为0 。2、问题:与指针相关的编程规则&规则分析
指针既然这么重要,而且容易出错,那么有没有方法可以很好地减少这些指针相关问题的出现呢?
答案与分析:
减少出错的根本是彻底理解指针。
在方法上,遵循一定的编码规则可能是最立竿见影的方法了,下面我来阐述一下与指针相关的编程规则:
1) 未使用的指针初始化为NULL 。
2) 在给指针分配空间前、分配后均应作判断。
3) 指针所指向的内容删除后也要清除指针本身。
要牢记指针是一个复合的数据结构这个本质,所以我们不论初始化和清除都要同时兼顾指针本身(上述规则1,3)和指针所指向的内容(上述规则2,3)这两个方面。
遵循这些规则可以有效地减少指针出错,我们来看下面的例子:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str !=NULL)语句不起作用。
如果我们牢记规则3,在free(str)后增加语句:
str = NULL;
那么,就可以防止这样的错误发生。