指针在使用前要进行初始化,我将指针初始化为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];
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