野指针的定义是什么呢?野指针出现未知问题的原因是什么呢?为什么普通变量一般不会出现安全问题,而指针变量会出现安全问题呢?如何避免野指针造成的安全问题呢?野指针和空指针后果的通俗解释是什么呢?

问题描述:

根据下列三段代码及其三个结果回答下列问题。代码一是野指针的定义,结果一是野指针运行出现的结果。代码二是空指针的定义以及空指针运行得到的结果。代码三是打印输出空指针地址。结果三是打印输出空指针地址的结果为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++编程中的表现和后果。以下是对这些问题的详细解答:

  1. 野指针的定义是什么呢?

    • 野指针是指被声明但未初始化(赋值)的指针。这样的指针会随机指向一块内存空间,可能导致未知的问题。
  2. 野指针出现未知问题的原因是什么呢?

    • 当指针被声明时,会立刻分配内存,但这块内存可能不是“干净”的,可能存在其他程序的残留数据。普通变量使用未初始化的内存时通常只是获得一个随机值,但指针不同,因为它可能指向敏感的内存区域,这可能会导致程序崩溃或其他安全问题。
  3. 为什么普通变量一般不会出现安全问题,而指针变量会出现安全问题呢?

    • 普通变量存储的是数据本身,即使未初始化使用,通常也只是获得一个随机值,不会影响程序的稳定性。而指针变量存储的是内存地址,未初始化的指针可能指向一个错误的地址,从而影响程序的稳定性,甚至可能影响其他程序的运行,导致安全漏洞。
  4. 如何避免野指针造成的安全问题呢?

    • 为了避免野指针,应养成良好的编程习惯:
      1. 及时初始化:在声明指针时就进行赋值(初始化),避免指针指向不确定的内存。
      2. 使用空指针:在暂时没有实际内存地址可赋值时,可以将指针置为空指针,表示它暂时不指向任何实际内存。例如:
        int *p = NULL;    // 或者
        int *p = nullptr;
        
        NULL是C++中的一个宏,表示“空”,本质上是0。nullptr是C++11引入的一个关键字,专门表示指针为空。
  5. 空指针和野指针在运行代码时会报同样的错误,原因一样吗?

    • 不一样。野指针由于可能指向一个随机的、甚至无效的地址,可能导致程序访问不该访问的内存区域,从而引发错误,影响自己和其他程序。而空指针明确指向0地址,虽然访问空指针也会导致错误,但这种错误仅限于程序内部,不会影响其他程序。
  6. 空指针的使用场景

    • 空指针通常在需要延迟赋值的场景下使用,作为一种临时状态。最终指针应当被赋值为有效的内存地址,或者不再使用指针。
  7. 代码3的结果输出为什么是0呢?

    • 在代码3中,指针p未被初始化,因此它指向一个随机的内存地址。在某些情况下,这个地址可能恰好是0。由于cout输出的是指针的地址值,因此输出为0
  8. 野指针和空指针后果的通俗解释是什么呢?

    • 可以通过以下比喻来解释:
      • 野指针:就像你去旅店开房间时,没有指定房间号(未初始化),服务员随机给了你一个房间钥匙。这可能导致你进入一个已经有人住的房间,进而影响别人,也可能被别人影响。
      • 空指针:就像你得到了一块写着“空房间”的牌子(指针指向0地址),但这个房间不存在,因此你只能在大厅等候,不会影响别人,但也无法入住,影响的只有你自己。

 

 

 

 

 

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神笔馬良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值