野指针出现的三种情况
局部指针变量没有被初始化
int main()
{
char *p;
strcpy(p,"hello world");//p指针是局部变量指针,没有被初始化,所以p指针所指的内存区不确定,或者说它的空间是不可用的,也就是p的内容不确定
//所以用strcpy给p指针指向的内存区赋值,这个过程也不确定。
printf("p=%s\n",p);
return 0;
}
解决方法
-
p = “hello world”; //把p拿来直接用不能达到我们的目的,那么我们就可以为p赋值,直接将字符串常量 "hello world"的地址赋值给p指针。
-
//首先为p开辟一块空间
P = (char )malloc(nsizeof(char));//n为要开辟空间的大小。
//然后用下面语句就没有问题了,但是要开辟空间的大小要大于"hello world"的字长。
strcpy(p,“hello world”);
指针所使用的变量在指针之前被销毁
char* func()
{
//因为p是局部变量,当执行完函数后就自动销毁了,所以主函数中s指向的地址也就被销毁了。
char p[] = "hello world!";
return p;
}
int main()
{
char * s = func();
printf("%s\n",s);
return 0;
}
解决方法
-
把char p[] = “hello world!”; 变成 char *p = “hello world!”;这样的话p虽然是局部变量,但他却是一个指针,只有四个字节,存的是在常量区的字符串"hello world!",所以这个常量区的字符串是全程序可读,所以return后依旧存在,返回的是p里的值,"hello world!"的首地址,是一个数,相当于把这个字符串的
地址在p的手里通过返回值转到s的手里。 -
把char p[] = “hello world!”; 变为static char p[] = “hello world!”;就可以把他存放在静态区,函数销毁,他也不会消失
指针提前释放
void func (char *p)
{
printf("p=%p\n",p);
free(p)
}
int main()
{
char *s = (char *)malloc(sizeof(char)*6);
strcpy(s, "hello");
func(s);
printf("s = %s\n",s); //错误,s指针已经在func中被释放了。
return 0;
}