问题描述:
根据下列三段代码及其三个结果回答下列问题。代码一是野指针的定义,结果一是野指针运行出现的结果。代码二是空指针的定义以及空指针运行得到的结果。代码三是打印输出空指针地址。结果三是打印输出空指针地址的结果为0。
代码1:
// Created by 黑马程序员.
#include "iostream"
using namespace std;
int main()
{
int *p; // 声明了一个指针变量(p就被分配了8个字节的空间)
*p = 10;
cout << "hello" << endl;
return 0;
}
结果1:
D:\CLion_code\cmake-build-debug\CLion_code.exe
Process finished with exit code -1073741819 (0xC0000005)
代码二:
// Created by 黑马程序员.
#include "iostream"
using namespace std;
int main()
{
int *p; // 声明了一个指针变量(p就被分配了8个字节的空间)
int *p1 = NULL; // 将指针标记为空
int *p2 = nullptr; // 将指针标记为空
*p1 = 10;
*p2 = 10;
cout << p1 << endl;
cout << "hello" << endl;
return 0;
}
结果二:
D:\CLion_code\cmake-build-debug\CLion_code.exe
Process finished with exit code -1073741819 (0xC0000005)
代码3:
// Created by 黑马程序员.
#include "iostream"
using namespace std;
int main()
{
int *p; // 声明了一个指针变量(p就被分配了8个字节的空间)
cout << p << endl;
cout << "hello" << endl;
return 0;
}
结果3:
D:\CLion_code\cmake-build-debug\CLion_code.exe
0
hello
Process finished with exit code 0
问题描述:
野指针的定义是什么呢?被声明但未初始化(赋值)的指针。这个指针会随机指向随机的内存空间,可能导致未知问题。野指针出现未知问题的原因是什么呢?指针声明会立刻分配内存,分配的内存不一定是干净的,可能会有其他程序的残留,使用普通变量影响不大,但是指针不一样,会导致安全问题。为什么普通变量一般不会出现安全问题,而指针变量会出现安全问题呢?如何避免野指针造成的安全问题呢?为了避免野指针,应当养成良好的编程习惯,及时进行赋值(初始化),或者将指针置为空指针更为安全。比如下面两条指令int * p=NULL;int * p=nullptr;。NULL是c++内置的宏,表示“空,什么都没有”的含义,其本质是0。nullptr是C++11标准引入的关键字,表示指针为空。上述代码,二选一均可,表示指针指向的地方为“空”,即哪里也不是。指针不指向任何地方,那么也就没有了安全问题。空指针和野指针在运行代码时会报同样的错误,原因一样吗?不一样,野指针有可能会指向别的地址导致出错,而空指针不会指向任何地址导致出错,空指针的出错只会影响我们自己开发的程序,不会影响其他程序,但是野指针有可能会影响其他程序。空指针也不是什么光荣的事情,只在需要指针前,但是需要延迟赋值的场景下作为过渡使用。指针最终要给具体的值,否则就不要使用指针。代码3的结果输出为什么是0呢?野指针和空指针后果的通俗解释是什么呢?假如你去旅店开房间,你没有指定好要哪个房间(赋值),服务员随意给了你一个房间牌,这个房间牌子可能已经住人了,你过去势必会影响别人休息,也会影响自己休息。空指针的意思是,服务员给了你一个房间牌,牌子上啥也没写,你可能只能在大厅等待,就只能影响自己,不会影响别人。
问题解答:
你的问题涉及野指针和空指针的概念,以及它们在C++编程中的表现和后果。以下是对这些问题的详细解答:
-
野指针的定义是什么呢?
- 野指针是指被声明但未初始化(赋值)的指针。这样的指针会随机指向一块内存空间,可能导致未知的问题。
-
野指针出现未知问题的原因是什么呢?
- 当指针被声明时,会立刻分配内存,但这块内存可能不是“干净”的,可能存在其他程序的残留数据。普通变量使用未初始化的内存时通常只是获得一个随机值,但指针不同,因为它可能指向敏感的内存区域,这可能会导致程序崩溃或其他安全问题。
-
为什么普通变量一般不会出现安全问题,而指针变量会出现安全问题呢?
- 普通变量存储的是数据本身,即使未初始化使用,通常也只是获得一个随机值,不会影响程序的稳定性。而指针变量存储的是内存地址,未初始化的指针可能指向一个错误的地址,从而影响程序的稳定性,甚至可能影响其他程序的运行,导致安全漏洞。
-
如何避免野指针造成的安全问题呢?
- 为了避免野指针,应养成良好的编程习惯:
- 及时初始化:在声明指针时就进行赋值(初始化),避免指针指向不确定的内存。
- 使用空指针:在暂时没有实际内存地址可赋值时,可以将指针置为空指针,表示它暂时不指向任何实际内存。例如:
int *p = NULL; // 或者 int *p = nullptr;
NULL
是C++中的一个宏,表示“空”,本质上是0。nullptr
是C++11引入的一个关键字,专门表示指针为空。
- 为了避免野指针,应养成良好的编程习惯:
-
空指针和野指针在运行代码时会报同样的错误,原因一样吗?
- 不一样。野指针由于可能指向一个随机的、甚至无效的地址,可能导致程序访问不该访问的内存区域,从而引发错误,影响自己和其他程序。而空指针明确指向
0
地址,虽然访问空指针也会导致错误,但这种错误仅限于程序内部,不会影响其他程序。
- 不一样。野指针由于可能指向一个随机的、甚至无效的地址,可能导致程序访问不该访问的内存区域,从而引发错误,影响自己和其他程序。而空指针明确指向
-
空指针的使用场景:
- 空指针通常在需要延迟赋值的场景下使用,作为一种临时状态。最终指针应当被赋值为有效的内存地址,或者不再使用指针。
-
代码3的结果输出为什么是0呢?
- 在代码3中,指针
p
未被初始化,因此它指向一个随机的内存地址。在某些情况下,这个地址可能恰好是0
。由于cout
输出的是指针的地址值,因此输出为0
。
- 在代码3中,指针
-
野指针和空指针后果的通俗解释是什么呢?
- 可以通过以下比喻来解释:
- 野指针:就像你去旅店开房间时,没有指定房间号(未初始化),服务员随机给了你一个房间钥匙。这可能导致你进入一个已经有人住的房间,进而影响别人,也可能被别人影响。
- 空指针:就像你得到了一块写着“空房间”的牌子(指针指向
0
地址),但这个房间不存在,因此你只能在大厅等候,不会影响别人,但也无法入住,影响的只有你自己。
- 可以通过以下比喻来解释: