指向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) 是否可以直接就赋值了???? 展开
int value;
abc* next;
}
int main () {
abc* aa = new abc;
aa = NULL; //此处的语句是否必要???
aa->value = 1; //如果上面语句可以,那么这条语句是否正确????
aa->next = NULL;
return 0;
}
最近指针的这个地方有点范头晕了,请大师指点迷津啊。指向NULL的指针(但是已经new abc了,后来指向的NULL) 是否可以直接就赋值了???? 展开
3个回答
展开全部
NULL是系统定义的常量,没有类型限定的0值。一般用来初始化一个指针变量,以标识指针未指向任何地址,或者说空指针,方便判断。
所以如果一个指针所指向的对象或内存已经释放,该指针必须马上设置为NULL,防止程序的其他代码不小心访问而造成程序崩溃。而使用指针前都应该判断一下,比如:
if(p){......}//如果p有效则执行后续代码。
所以你的例子中a=NULL不但没必要,而且根本就是错误的。new一个结构后,aa取得该指针,然后又把指针设置为空,把该内存地址丢了,也就是把新建的内存放弃不用了,并且内存又没释放,造成内存泄漏。而后续代码又要去访问它,访问前也没判断,会引起程序意外终止。
所以如果一个指针所指向的对象或内存已经释放,该指针必须马上设置为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。换句话说就是采用对象地址初始化指针,使指针有效。
展开全部
aa = NULL; 此语句符合语法,单独执行是没有错误的,但是本程序中你这么一赋值,就相当于把这个指针给废了,下面的aa->value = 1;就会出错。
所以,本程序中,你千万不能aa = NULL;
所以,本程序中,你千万不能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地址,都无法正常的存取有效数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
NULL的地址为0x00
aa->value = 1 相当于将0x00处的4字节内容赋值为1
aa->next = NULL 相当于将0x04处的4直接内容赋值为0
你这样做,aa变成了指向0的指针,在这里没用。 new的abc没有得到释放。
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;这三个相互间有什么区别呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询