野指针
“野指针”不是 NULL 指针,是指向“垃圾”内存的指针。人们一般不会错用 NULL 指
针,因为用 if 语句很容易判断。但是“野指针”是很危险的,if 语句对它不起作用。野指
针的成因主要有两种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为 NULL 指针,
它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要
么将指针设置为 NULL,要么让它指向合法的内存。
二、指针 p 被 free 或者 delete 之后,没有置为 NULL,让人误以为 p 是个合法的
指针。别看 free 和 delete 的名字恶狠狠的(尤其是 delete),它们只是把指针所指的
内存给释放掉,但并没有把指针本身干掉。通常会用语句 if (p != NULL)进行防错处理。
很遗憾,此时 if 语句起不到防错作用,因为即便 p 不是 NULL 指针,它也不指向合法的
内存块。例:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是 p 所指的地址仍然不变
if(p != NULL) // 没有起到防错作用
strcpy(p, “world”); // 出错
另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结
束时会被释放。
野指针小结(2009-5-19 23:07:00)
【收藏】 【评论】 【打印】 【关闭】
标签:野指针
1.指针的初始化
指针变量的零值是“空”(记为 NULL)。在<stdio.h>中#define NULL 0,尽管 NULL 的值
与 0 相同,但是两者意义不同。假设指针变量的名字为 p,它与零值比较的标准 if 语句如下:
if (p == NULL) // p 与 NULL 显式比较,强调 p 是指针变量。
当我们试图析取(dereference)一个空指针 NULL 时,例如 int *p = NULL;当我们试图
cout<<*p;析取 p 时,将会出现内存读错误。因为 0x00000000 为进程私有地址,是不允许
访问的,因此将会弹出应用程序错误:“0x********”指令引用的“0x00000000”内存。该内存
不能“read”。
如果定义指针时把它初始化为 NULL,我们的代码就能用 if(ptr==NULL)来判断它是不是
有效的指针。
因此,建议定义指针后将其初始化为 NULL 或指向合法内存。
典型错误:char *dest; char *src = "Fantasy"; strcpy(dest, src);
2.检查一个指针是否有效
malloc returns a void pointer to the allocated space, or NULL if there is
insucient memory available.
评论1
最新资源