(NULL == p)&&(p == NULL)的区别

(NULL == p)&&(p == NULL)的区别,第1张

if(NULL != p)和f(p != NULL)两者并没什么区别,都是判断指针p是否为空。

但是当考虑到出错检查时,if(NULL != p)写法更好,因为如果误写为if(NULL = p)的时候,编译器就会提示出错(因为常量不能被赋值);而if(p != NULL)如果误写为if(p = NULL),则编译器不会报错

P=NUL也错了,应该是P=NULL;。成功声明的指针p,经p=NULL;后,p的值确实是0,但规定不是指向0单元的意思,而是表示这个指针p为不能使用的无效指针。这可以这么验证,用p取地址为0的单元里的值就是连编译都不会让过的非法操作。

P不会等于NULL。

在C++中,如果动态分配内存空间不足,会抛出 std::bad_alloc 类型的异常。

也就是说程序的执行流程上来说,不会从new调用返回,也就不存在返回值是NULL这么一说了。

如果你要它失败的时候返回NULL,可以这样写

int P = new(std::nothrow) int[10];

if (p == NULL)

该操作功能为如果p非空,则释放p指向的内存。

delete 是C++中的关键字,其功能为释放内存,与之对应的是new关键字。

new关键字可以申请一个单位空间,如

int p = new int;

是申请一个大小为int型所占空间大小的内存,并把首地址赋值给指针p。

当使用后要释放时,需要调用

delete p;

new关键字还可以申请一组空间,如

int p = new int [10];

申请一组10个int型的空间,并赋值给指针p。

这种情况下要释放时需要调用

delete [] p;

这种就是本题中所描述的情况。

至于if(p)这种写法是从C中继承来的。C中使用的分配空间函数为malloc,释放空间函数为free

当调用free且参数为空指针(NULL)时,程序会崩溃,所以在释放的时候一般用

if(p)free(p);来做保护。即只有p非空时才释放。

而C++的delete关键字对此已经做了优化,当参数p为NULL时将不会报错,同时也不会做任何操作。所以在这里的if(p)实际上已经没有必要。只不过在使用C的free函数习惯后,或者不了解delete的新特性的编程人员,还是会加上if(p)来做保护。

外面的判断是为了防止不必要地操作mutex,里面的判断是为了防止多次实例化。

外面的判断是出于性能优化(非必须),而里面的判断是出于只实例化一次的保证(必须的)

回顾下代码:

if (p == NULL)

{

pthread_mutex_lock(&mutex);

if (p==NULL)

p = new singleton();

pthread_mutex_unlock(&mutex);

}两个mutex中间是临界区,是保证同时最多只有一个线程的。

外面的p==NULL在临界区外;这时,如果删掉了里面的p==NULL,在下面的情形下,就会发生内存泄漏:

线程A判断p==NULL为真

线程B判断p==NULL为真

线程A进入临界区

线程A实例化p

线程A退出临界区

线程B进入临界区

线程B实例化p

线程B退出临界区

所以,里面的p==NULL在多线程环境下是必要的。

外面的p==NULL虽然不必要,删掉它依然可以保证只p实例化一次,但他可以在p已经实例化后避免线程再进入临界区,提升性能。

new之后你会得到一块地盘(内存空间),里面的内容随你改,其他程序不得动用。

free(p) 后P指向的那块地不再归你使用,里面的内容不一定变化,但是P还是指着那不动。

单纯的p==NULL的话,P指向0,那块地还是归你使用,其他程序不得动用,但是你再也找不到那块地了,这就是内存泄露。

第一题

a、p是一个地址,你可以说p=&x,但不能说a=x,a不对

b、p是指向一个变量地址的指针,而x是int型,b不对

c、c是对的,这是指针的初始化。

d、int p;p=null;该句代码的意思是p指向的内存赋值为NULL,这不是合法的内存,d不对。

第二题

在c语言中null与0相对应,因此,p=null,p=0,p='\0'都是正确的

而字符'0’或者空格符的ASCII都不是0

在头文件 中 定义的一个常量 NULL=0;

用于指将指针 悬空(不指向任何位置)楼上的指向0内存不对的.

int p=NULL;

NULL是个好东西,给一出生的指针一个安分的家

NULL总是被定义为0吗

NULL不是被定义为o,就是被定义为(void )0,这两种值几乎是相同的。当程序中需要一个指针时(尽管编译程序并不是总能指示什么时候需要一个指针),一个纯粹的零或者一个void指针都能自动被转换成所需的任何类型的指针。

NULL总是等于0吗

对这个问题的回答与“等于”所指的意思有关。如果你是指“与。比较的结果为相等”,例如:

    if(/  ...  /)

    {   

        p=NULL;

    }   

    else   

    {

        p=/ something else /;

    }

    /  ...  /

    if(p==0)

那么NULL确实总是等于0,这也就是空指针定义的本质所在。

如果你是指“其存储方式和整型值。相同”,那么答案是“不”。NULL并不必须被存为一个整型值0,尽管这是NULL最常见的存储方式。在有些计算机中,NULL会被存成另外一些形式。

如果你想知道NULL是否被存为一个整型值0,你可以(并且只能)通过调试程序来查看空指针的值,或者通过程序直接将空指针的值打印出来(如果你将一个空指针强制转换成整类型,那么你所看到的很可能就是一个非零值)。

欢迎分享,转载请注明来源:表白网

原文地址:https://h5.hunlipic.com/biaobai/4067095.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-04-13
下一篇2024-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存