[传智播客]C++基础视频(深入浅出版)C语言提高-指针的强化

野指针产生的原因

释放了指针所致的内存空间,但是指针变量本身没有重置成NULL。
理解:指针变量和它所指向的内存空间变量是两个不同的概念,但我们free了内存空间后,指针还存着被释放内存空间的地址形成野指针。

避免方法
  1. 定义指针的时候 初始化成NULL。
  2. 释放指针所指向的内存空间后,把指针重置成NULL。
void main()
{
	char  *p1 = NULL;
	p1 = (char *)malloc(100);
	if (p1 == NULL)
	{
		return ;
	}
	strcpy(p1, "11112222");

	printf("p1:%s \n", p1);

	if (p1 != NULL)
	{
		free(p1);
		p1 = NULL;  //增加此代码,能避免下一个判断进入,执行释放野指针代码导致出错
	}
	
	if (p1 != NULL)
	{
		free(p1);  
	}

	printf("hello...\n");
	system("pause");
	return ;
}

分析下面代码
1、声明P1的指针,初始化为空,意味着P1所指向的内存空间为MULL;
2、内存空间为0的地址是特殊的地址,不能随意使用,当我们用strcpy函数往里面存值时,会发生错误;
3、指针强制赋值也是错误的,只有指针指向的地址是有效的才可以。

结论:只有指针指向的地址一定要有效,不然会编译错误

//编译运行出错
void main()
{
	char *p1 = NULL;
	strcpy(p1, "abcdefg");
	printf("hello...\n");
	system("pause");
	return ;
}
//编译运行出错
void main2()
{
	char *p1 = NULL;
	p1 = 0x00000077;
	strcpy(p1, "abcdefg");
	printf("hello...\n");
	system("pause");
	return ;
}
不断改变指针指向强化

分析:在栈区的压栈顺序是buf、i、j、p2、p1;
下面代码代表P1不断指向buf地址,buf[i]相当于buf+i;

p1 = &buf[0]; //不断的修改p1的值 相当于 不断改变指针的指向
p1 = &buf[1];
p1 = &buf[2];
for (i=0; i<10; i++)
{
	p1 = buf[i];//改变指针指向
}

p2 = (char *)malloc(100);//在堆区分配一块内存,p2指向该内存地址
p1 = p2+i;//p1不断指向p2对应的堆区地址

总结:很像是c语言的函数之间的调用,共享同一块内存空间。
不同的函数,不同的指针操作同一块内存空间,这就是c语言的精华。

void main()
{
	char	buf[128]; //c可以在栈上分配内存
	int		i; 
	int     j = 0;

	char	*p2 = NULL; //c可以在栈上分配内存

	char *p1 = NULL;

	p1 = &buf[0]; //不断的修改p1的值 相当于 不断改变指针的指向
	p1 = &buf[1];
	p1 = &buf[2];

	for (i=0; i<10; i++)
	{
		p1 = buf[i];//改变指针指向
	}

	p2 = (char *)malloc(100);
	strcpy(p2, "abcdefg1212333333333311");

	for (i=0; i<10; i++)
	{
		p1 = p2+i;
		printf("%c ", *p1);
	}

	printf("hello...\n");
	system("pause");
	return ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值