再回首(三):野指针产生原因及解决方案

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//野指针产生问题分析
//指针变量和它所指内存空间变量是两个不同的概念


//解决野指针的方案
//1定义指针时 把指针变量赋值成null
//2 释放内存时,先判断指针变量是否为null 
//3 释放内存完毕后,把指针变量重新赋值成null

//
void wild_pointertest()
{
	char *p = NULL;
	p = (char *)malloc(100); //char p[100];
	strcpy(p, "abcdefg");
	if (p != NULL)
	{
		free(p);
		p = NULL;
	}

	if (p != NULL)
	{
		free(p);
	}
	system("pause");
}

char *getMem2(int count)
{
	char *tmp = NULL;
	tmp = (char *)malloc(count * sizeof(char)); //char tmp[100];
	return tmp;
}

//实参和形参是两个不同的概念
void getMem3(int count, char *p)
{
	char *tmp = NULL;
	tmp = (char *)malloc(count * sizeof(char)); //char tmp[100];
	p = tmp; //在这个场景下,你给形参赋值了,没有给实参赋值 
	//直接修改实参没戏。。。。。。。 实参和形参是两个不同的概念
	//return tmp;
}

void getMem4(int count, char **p /*out*/)
{
	char *tmp = NULL;
	tmp = (char *)malloc(count * sizeof(char)); //char tmp[100];
	//p = tmp; //在这个场景下,你给形参赋值了,没有给实参赋值 
	//直接修改实参没戏。。。。。。。 实参和形参是两个不同的概念
	//间接的修改实参
	*p = tmp;
	//return tmp;
}

//函数调用的时候,这个场景修改不实参
int FreeMem2(char *p)
{
	if (p == NULL)
	{
		return -1;
	}
	if (p != NULL)
	{
		free(p);
		p = NULL; //想把实参给改掉,你能修改吗? 修改不了实参。。。。。
	}
	return 0;
}
int FreeMem3(char **p)
{
	if (*p == NULL)
	{
		return -1;
	}
	if (*p != NULL)
	{
		free(*p);
		*p = NULL; //想把实参给改掉,二级指针可以修改一级指针的值。。。。。
	}
	return 0;
}

void main()
{
	//wild_pointertest();//一个函数中创建和释放内存,没有实参和形参的传递  一般注意不会产生野指针
	char *myp = NULL;
	/*myp = getMem2(100);
	getMem3(100, myp);*///没有真正的改变传入的实参

	getMem4(100, &myp);//传入二级指针用来改变一级指针的值  可以真正的改变实参值
	strcpy(myp,"bbbbb");
	
	//做业务操作
	//此 50000
	/*FreeMem2(myp);
	FreeMem2(myp);*///没有真正的释放实参 
	FreeMem3(&myp);

	FreeMem3(&myp);
	system("pause");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值