NULL指针能在赋值吗

指针在使用前要进行初始化,我将指针初始化为NULL,再对它赋值,为啥不行呢?
#include<stdio.h>
void main()
{
int *a = NULL;
*a = 3;
printf("%d",*a);
}
我用malloc动态申请内存后,free掉这段内存,指向这段内存的指针在被赋值为NULL后还能在用吗?再用它指向别的地方,可以吗?

 

提问者采纳

指针初始化为NULL,还是没有分配内存,所以要报错。
指针是个变量。就是个装地址的变量。是变量就可以重复使用。
free掉,并且指向NULL,再分配内存(初始化指向别的地方)又可以用了。
之所哟free掉了再指向NULL是防止误用了野指针修改随机内存。

 

 

void main()
{
int *a = NULL;  // 定义了a指针变量,指向NULL
*a = 3;  //问题出在这里,*a指向的是NULL,也就是a没有指向任何变量,你把一个常量3赋值给一个不存在的NULL,是行不通的。
printf("%d",*a);
}

我用malloc动态申请内存后,free掉这段内存,指向这段内存的指针在被赋值为NULL后还能在用吗?再用它指向别的地方,可以吗?

Free掉以后最好把指针指向NULL,如果不指向的话,依然指向这块内存区域,如果你不小心,就使用了该指针,修改指针指向的区域,但是这个内存区域和你已经没有任何关系了,
你就破坏了其他有用的数据,俗称野指针,你可以百度一下哦。危害很大的。
再用它指向别的地方是可以的。

 

 

这两个“*“的含义其实是不一样的。
定义int *a中“ * "是指针的意思,表示a是一个指针。
而*a中" * "的作用是“引用”,即引用地址a的值,但是空地址不可以引用。

 

指针在赋值为NULL后还能用new给他再赋值吗

 

能的,指针的地址跟它指向的地址是不一样的。
我们说的给指针用new赋值,其实是在内存上分配一块内存,然后将内存的首地址传给指针,指针的值就是内存的首地址。
delete也是将分配的内存收回,跟指针本身没有关系,指针本身没有任何改变。
当然,如果指针本身的值在delete前改变,会导致找不到分配的内存,而没有办法使用和释放内存。

int *pData = NULL;
...
pData = new int[3]; //pData获得int[3]的内存首地址
pData = new int[6]; //pData获得int[6]的内存首地址,pData的值改变,int[3]的地址再也找不回来的(没有保存),所以不要这样用。
....
delete [] pData; //pData值没变,但是它指向的内存被系统收回,如果它仍然来读写该出内存,可能导致错误。
pData = NULL;  //防止误用,可以不用赋值NULL
...
pData = new int[5]; //重新获得int[5]的首地址

 

 

当然能,一般的用法为:

int *pData = NULL;
...
pData = new int[3];
....
delete [] pData;
pData = NULL;
...
pData = new int[5];

 

 

 

2010-03-12 22:28

delete指针之后应该赋值NULL

首先,C++标准规定:delete空指针是合法的,没有副作用。

但是,delete p后,p并不会自动被置为NULL

问题来了,对一个非空指针delete后,若没有赋NULL,若再次delete的话,有可能出现问题。

如下代码

int *p = new int(3);

delete p;

delete p;

用VC编译运行将出现问题。

将其改为:

int *p = new int(3);

delete p;

p = NULL;

delete p;

则不会出现问题(因为delete空指针是合法的)

所以,为了避免出现问题,指针被delete之后应该赋值NULL

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值