野指针的危害—引用和指针(四)

目录

 

“野指针”的定义

野指针的成因

野指针变量不可以被赋值

野指针不能用于变量值的互换


“野指针”的定义

野指针不是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;
}

运行如下:

单纯的考虑交换值,很小儿科对吧! 

发布了278 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_17846375/article/details/104970732