指向NULL的指针可否赋值

structabc{intvalue;abc*next;}intmain(){abc*aa=newabc;aa=NULL;//此处的语句是否必要???aa->value=... struct abc {
int value;

abc* next;

}
int main () {
abc* aa = new abc;

aa = NULL; //此处的语句是否必要???

aa->value = 1; //如果上面语句可以,那么这条语句是否正确????

aa->next = NULL;

return 0;

}

最近指针的这个地方有点范头晕了,请大师指点迷津啊。指向NULL的指针(但是已经new abc了,后来指向的NULL) 是否可以直接就赋值了????
展开
 我来答
CodeBlove
推荐于2017-11-26 · TA获得超过3363个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:237万
展开全部
NULL是系统定义的常量,没有类型限定的0值。一般用来初始化一个指针变量,以标识指针未指向任何地址,或者说空指针,方便判断。

所以如果一个指针所指向的对象或内存已经释放,该指针必须马上设置为NULL,防止程序的其他代码不小心访问而造成程序崩溃。而使用指针前都应该判断一下,比如:
if(p){......}//如果p有效则执行后续代码。

所以你的例子中a=NULL不但没必要,而且根本就是错误的。new一个结构后,aa取得该指针,然后又把指针设置为空,把该内存地址丢了,也就是把新建的内存放弃不用了,并且内存又没释放,造成内存泄漏。而后续代码又要去访问它,访问前也没判断,会引起程序意外终止。
更多追问追答
追问
先谢过!!!再问一下,就是那个abc* aa; 和abc* aa = NULL; 和 abc* aa = new abc;这三个相互间有什么区别呢?
追答
abc* aa
定义一个指向结构体abc类型的指针变量,不进行初始化,aa的值可能是任意值,不建议这么写。

abc* aa=NULL
这个已经解释过了,定义之后aa初始化为NULL。

abc* aa=new abc
这也说明过了,新建一个abc类型的结构对象,返回首地址,赋值给aa。换句话说就是采用对象地址初始化指针,使指针有效。
阳光上的桥
2014-09-16 · 知道合伙人软件行家
阳光上的桥
知道合伙人软件行家
采纳数:21424 获赞数:65794
网盘是个好东东,可以对话和传文件

向TA提问 私信TA
展开全部
aa = NULL; 此语句符合语法,单独执行是没有错误的,但是本程序中你这么一赋值,就相当于把这个指针给废了,下面的aa->value = 1;就会出错。

所以,本程序中,你千万不能aa = NULL;
更多追问追答
追问
先谢过!!!再问一下,如果不用aa = NULL; 的话,是不是这个指针很危险呢?还有就是那个abc* aa; 和abc* aa = NULL; 和 abc* aa = new abc;这三个相互间有什么区别呢?
追答
其实指针相当于是一个INT的变量,只是它存放的是内存地址,你的三个语句这么理解:

abc* aa;
相当于:
int aa;
定义了指针变量aa,但是没有初始化,指向的是随机内存空间,如果直接操作其指向的地方,可能会发生不可意料的灾难。(例如无权限管理的DOS时代修改系统文件表等重要内容导致磁盘崩溃)

abc* aa = NULL;
相当于:
int aa=0;
定义了指针变量aa,并且初始化执行一个特殊的内存地址,操作这个地址一般会引起报错(或者失败、或者无所谓),但是不会出现更严重的灾难。

abc* aa = new abc

相当于:
int aa;
abc tmp;
aa=&tmp;
定义一个指针,并且为它分配一块内存,并且让这个指针指向那块已经分配的内存。这之后可以正确使用(存取)指针指向的内存空间。前面两种情况都没有分配内存空间,指针无论是指向随机地址、还是特定NULL地址,都无法正常的存取有效数据。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友e208b91
2014-09-16 · 超过13用户采纳过TA的回答
知道答主
回答量:27
采纳率:0%
帮助的人:19万
展开全部
NULL的地址为0x00
aa->value = 1 相当于将0x00处的4字节内容赋值为1
aa->next = NULL 相当于将0x04处的4直接内容赋值为0
你这样做,aa变成了指向0的指针,在这里没用。 new的abc没有得到释放。
追问
先谢过!!!再问一下,就是那个abc* aa; 和abc* aa = NULL; 和 abc* aa = new abc;这三个相互间有什么区别呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式