典型野指针出现的三种情况

局部指针变量没有被初始化

int main()
{
char *p;
strcpy(p,"hello world");//p指针是局部变量指针,没有被初始化,所以p指针所指的内存区不确定,或者说它的空间是不可用的,也就是p的内容不确定
//所以用strcpy给p指针指向的内存区赋值,这个过程也不确定。
printf("p=%s\n",p);
return 0;
}

解决方法

  1. p = “hello world”; //把p拿来直接用不能达到我们的目的,那么我们就可以为p赋值,直接将字符串常量 "hello world"的地址赋值给p指针。

  2. //首先为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;
}

解决方法

  1. 把char p[] = “hello world!”; 变成 char *p = “hello world!”;这样的话p虽然是局部变量,但他却是一个指针,只有四个字节,存的是在常量区的字符串"hello world!",所以这个常量区的字符串是全程序可读,所以return后依旧存在,返回的是p里的值,"hello world!"的首地址,是一个数,相当于把这个字符串的
    地址在p的手里通过返回值转到s的手里。

  2. 把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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值