野指针 与指针参数传递内存

一、杜绝“野指针”
“野指针”不是NULL指针,只指向“垃圾”内存的指针。
对于NULL指针,if语句容易判断,能避免错误;
但野指针,if语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。
解决办法:创建指针的同时对其初始化,要么将指针设置为NULL,要么让它指向合法的内存;

char *p = NULL;
char *str = (char *)malloc(100);

(2)free或者delete释放内存后的指针没有赋值为NULL

char *p = (char*)malloc(100);
strcpy(p , "hello");
free(p);   //p所指向的内存被释放,但p所指向的地址没有变,产生野指针
//p = NULL;消除风险

if(p != NULL)
{
	strcpy(p,"world");//出错,p指向了无效的内存
}

(3)指针操作超越了变量的作用范围。

二.指针参数如何传递内存?

1.错误的例子

void GetMemory(char *p, int num)
{
	p = (char*)malloc(sizeof(char)*num); 
}


void Test(void)
{
  char *str = NULL;
  GetMemory(str,100); //str依然为NULL;
  strcpy(str, "hello");//运行错误
  //程序每运行一次GetMemory就会泄露一块内存
}

2.正确例子1: 二级指针进行指针参数申请内存

void GetMemory2(char **p, int num)
{
	*p = (char *)malloc(sizeof(char)* num);
}

void Test2(void)
{
	char *str = NULL;
	GetMemory2(&p,100);
	strcpy(str,"hello");
	cout << str <<endl;
	free(str);
}

3.正确例子2:函数返回值来传递动态内存(堆内存)

char *GetMemory3( int num)
{
	char *p = (char *)malloc(sizeof(char)* num);//堆内存
	return p;//返回指向堆内存的指针
}

void Test3(void)
{
	char *str = NULL;//初始化
	str = GetMemory3(100);//分配内存
	strcpy(str,"hello");//运用
	cout << str <<endl;
	free(str);//释放内存
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值