由NULL引发的几个问题

  适才与朋友聊起了C++中NULL,由于他是搞OC的,对指针这块儿不是很理解,我就斗胆扯了一通我眼里的NULL给他听。结果自然是他没听懂,我没讲明白,所以回宿舍后我又与室友聊了一番。
  千聊万聊,不如在编译器里跑一把。我打开了我的VS2015,跑什么呢?
  得嘞,就从最简单的开始吧,

#include <iostream>
using namespace std;
int main()
{
    int *p;
    cout << p;
    return 0;
}

这里写图片描述
不出意外,未经初始化的指针p,连编译都没法通过。当然,此时的指针p是一个野指针,无法使用。

  那指针进行初始化了又是什么情况呢?

#include <iostream>
using namespace std;
int main()
{
    int *p=NULL;
    cout << p;
    return 0;
}

这里写图片描述
可以,编译通过,跑起来了,指针的值还可以打印出来,是一串的0。显然,这里的NULL就是0(当然我是经过了一番查找资料)。
  那么空指针的指针值为0,那么空指针的内存我们能调用吗?

#include <iostream>
using namespace std;
int main()
{
    int *p=NULL;
    cout << p;
    cout << *p;
    return 0;
}

这里写图片描述
代码很干脆的挂了,原因很简单,地址为0x000000000的内存不可访问。所以呢,我们可以这样理解,空指针实际上是指向的地址为0x0000的内存, 而这块内存又不允许我们进行访问。这与野指针是不一样的。

  朋友又和我说了一个OOP中的问题,创建了一个类,类中有个成员变量是指针,但没有进行初始化,回事什么情况?
  多说无益,跑一把便知

#include <iostream>
using namespace std;
class A 
{
public:
    int a = 0;
    int *p;
};
int main()
{
    A m;
    cout << m.a << endl;
    return 0;
}

这里写图片描述
这里很清楚的可以看到p的值编程了0x00000000,与我们给p赋值NULL的时候一样了。由此可见,当我们在使用类的时候,类里面的指针会自动被初始化为NULL,至于是编译器的功劳还是底层代码的实现,那还有待我进一步考证。

  好了,关于NULL,我目前的理解也就是这样啦,更详细的内容可以参考:http://blog.csdn.net/fu_zk/article/details/21030607这篇文章进行了解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"app passed null surface"是一个错误信息,表明应用程序在传递一个空的Surface对象时发生了问题。Surface是Android系统中的绘图目标,用于显示图形、动画或视频。当应用程序试图将图形或视频渲染到Surface时,如果传递了一个空的Surface对象,则会引发此错误。 通常情况下,传递null Surface的原因可能是以下几个方面: 1. Surface对象未正确初始化:应用程序可能没有正确初始化Surface对象,导致传递时为空。在使用Surface之前,必须先实例化和初始化它。 2. Surface对象被销毁或释放:应用程序可能在使用Surface之前将其销毁或释放,导致传递时为空。在使用Surface对象之前,需要确保它处于有效状态。 3. 异步操作或并发访问问题:应用程序可能在使用Surface对象时存在并发访问问题,例如多个线程同时访问Surface。这可能导致出现null Surface错误。 为了解决这个问题,可以尝试以下解决方案: 1. 确保正确初始化Surface对象并在使用之前验证其有效性。 2. 检查Surface对象的生命周期,确保在使用期间不会被销毁或释放。 3. 考虑使用同步机制(如锁)来避免并发访问问题。 4. 检查应用程序的代码,查找可能导致传递null Surface的错误逻辑或错误用法。 总结:出现"app passed null surface"错误是因为应用程序在传递空的Surface对象时出现了问题。为了解决这个错误,需要确保正确初始化Surface对象,检查其生命周期并避免并发访问问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值