目录
“野指针”的定义
野指针不是NULL指针,而是指向垃圾内存的指针。野指针可以很容易被if语句来判断出来,如果发现if对某个指针不起作用,可以怀疑这个指针是野指针。
野指针的成因
忘了将指针初始化。任何指针在刚创建的时候,不会自动变成NULL的,里面其实都是随机值,或者说是垃圾值,必须人为的进行初始化才行。
指针被free或delete之后,没有置为NULL,让人误以为是合法的,但其实里面也是垃圾值。也必须人为的进行初始化才行。
野指针变量不可以被赋值
给野指针赋值的时候,编译器会报错:
野指针不能用于变量值的互换
和上面的问题一样,没有被初始化的指针,是不会被编译器通过的。
那是不是将其初始化后,就可以了呢?
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int* p = NULL;
int a = 1;
int b = 2;
*p = b;
b = a;
a = *p;
system("pause");
return 0;
}
会成功吗?还是报错:
这就要说到另一个非常常见的错误了,定义一个指针:"int *p",p是指针变量,*p,是p所指向内存空间所存放的内容,而当进行完初始化后"int *p = NULL;",一定要注意,这个初始化的是指针变量p,当初始化结束后,变成了:p这个指针变量中存放的内容为NULL,此时的*p,表示内存地址为NULL的地址中所存放的内容,但这个地址存在吗?肯定不存在,所以,当以*p作为操作对象进行操作的时候,很显然照样报错,一般我们都是给指针变量赋值,或者给有实际指向的指针所指向的内容赋值:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int* p = NULL;
int a = 1;
int b = 2;
int c = 3;
printf("a:%d,b:%d,c:%d\n", a, b, c);
p = &b; //对指针变量进行操作
b = a;
a = *p;
*p = c; //经过上面对p的修改,*p,不是表示NULL所指向的内存内容了,所以,可以被作为左值被使用了!
printf("a:%d,b:%d,c:%d\n", a, b, *p);
system("pause");
return 0;
}
运行结果:
当然,话说回来,我们要实现两值交换,现在一直没弄,下面给弄下哈:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int* p = NULL;
int a = 1;
int b = 2;
int c;
printf("a:%d,b:%d\n", a, b);
c = b;
b = a;
a = c;
printf("a:%d,b:%d\n", a, b);
system("pause");
return 0;
}
运行如下:
单纯的考虑交换值,很小儿科对吧!