很多人在申请指针时,直接定义比如int *p
;char *p
;
pNode biTree;
这样是有风险的,因为该指针会随机指向一个不能确定的地方,甚至是不能进行修改的地方,造成程序崩溃!除非你对它进行初始化。
尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问。那么如何初始化指针变量呢,一般有以下几种方法:
1、定义时初始化为空指针
在后续需要修改该指针的时候给他分配空间或者指向一个合法的地址/变量
int* p=NULL;
int a;
p=&a;
2、用已有的变量初始化
int length=5;
int* pInteger=&length;
3、用内存分配函数给指针分配空间并将指针指向它(自己定义的结构体)
typedef struct Node tNode; /// 树的节点类型
typedef struct Node *pNode; /// 树的指针类型
pNode _root=(pNode)malloc(sizeof(tNode));
参考于https://www.cnblogs.com/I-L-o-v-e-z-h-o-u/p/4950528.html
正确方法:
1.用动态储存分配函数malloc()申请指针
2.判断所申请的指针是不是指向NULL,不是则成功申请
3.你的操作
4.使用完毕后要使用free()进行指针的释放,防止内存泄露
5.为了安全把释放内存后的指针指向NULL
最后你需要了解:
关于malloc()函数
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。
内存泄露:
指针使用之后,如果不释放指针所使用的内存,就会造成内存的泄露,这样就会有大量内存由于没能释放,别的程序不可以使用这部分内存,如果一个程序不停申请内存而不去释放内存,很快就会造成系统的崩溃。那么如何正确的申请和释放内存呢。
free()
free函数在释放指针后,只是单纯的释放了该指针指向的内存空间,而没有将指针赋为空值。所以一定要记得在释放指针后将指针赋为空值。
指针的规范操作示例:
#include<bits/stdc++.h>
using namespace std;
/// 树节点类型,数据结构
struct Node {
/// 假设只用到2个数据域
int id; /// 编号
char name[20]; /// 名字
/// lchild 和 rchild 是必要的指针域。 parent则是可选的指针域,加了它,更容易追溯祖先。
struct Node *lchild; /// 左孩子指针
struct Node *rchild; /// 右孩子指针
struct Node *parent; /// 父指针
};
typedef struct Node tNode; /// 树的节点类型
typedef struct Node *pNode; /// 树的指针类型
int main(void)
{
pNode biTree = ( pNode ) malloc( sizeof( tNode ) ); /// 申请节点空间
if( biTree == NULL ) { /// 创建节点失败
printf("创建节点失败!!!\n");
return -1;
}
char *s="jbksjbckdbkcbkd";
biTree->id =123456;strcpy( biTree->name, s );
printf("%d %s\n",biTree->id ,biTree->name );
int a;
scanf("%d",&a);
free(biTree);//释放
biTree=NULL;
return 0;
}
或者你在定义的时候不给它分配空间
pNode p;//定义
………………
//在你需要使用p的时候,才给它分配空间
pNode cur=root;//直接指向root(已经有的合法的变量)
while(cur!=NULL)
{
if(cur->id ==id)
return cur;//查找成功
if(id<cur->id )
cur=cur->lchild ;
else
cur=cur->rchild ;
}
关键:看你需要的指针是干嘛的,如果你定义的指针是用来迭代的,那么不用给它申请空间,如果是要直接存数据的就给它申请空间。
想要了解更多的朋友可以移步:
https://www.cnblogs.com/I-L-o-v-e-z-h-o-u/p/4950528.html