野指针产生的原因
释放了指针所致的内存空间,但是指针变量本身没有重置成NULL。
理解:指针变量和它所指向的内存空间变量是两个不同的概念,但我们free了内存空间后,指针还存着被释放内存空间的地址形成野指针。
避免方法
- 定义指针的时候 初始化成NULL。
- 释放指针所指向的内存空间后,把指针重置成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 ;
}