c语言全局指针变量怎么初始化,关于全局变量的初始化问题与野指针

今天遇到一个小问题,定义一个全局的指针变量p1,并通过malloc动态分配内存的方法,将一块内存的首地址赋给p1。

代码如下:

char *p1=malloc(1000);

但是使用 gcc 命令编译后报出如下错误(使用C99标准)

39575100afef2aa475651229809167a0.png

1282836553445425152.htm

看了别人的博客后才知道是如下原因:

c99标准中规定:全局变量和static变量的初始化需要指定一个常量,不能是一个非常量的表达式;而在c++中是可以的。

而且在操作c和c++全局变量时,只能对其采用初始化的方式,而不能采用赋值的方式,即可以

int a = 10;

而不可以:

int a;

a = 10;

解决方法如下:

1.先声明一个空指针

char *p1=NULL;

2.然后在函数中对其赋值

p1=(char*)malloc(1000);

说明:第一步中,必须要将p1初始化,这样是为了避免野指针。

下面再顺便总结一下野指针:

1.什么是野指针?

指向不确定地址的指针变量

2.产生野指针的原因?

2.1 定义的指针变量没有初始化

int *p; //错误

int *p=NULL; //正确

2.2 使用malloc给一个指针变量申请内存,释放后没有将指针变量置为NULL

1)申请一块内存

int *p=(int*)malloc(1000*sizeof(int));2)释放内存

free(p);第二部执行后,p变为野指针,free只是释放了申请的内存,但是这个指针变量依然存在。

3) 将p置为空指针

p=NULL;经过第3步后,p就指向了NULL,避免空指针的产生,否者,在不知道p的状态的情况下,如果访问了p,可能会访问非法的内存,产生段错误。

  • 0
    点赞
  • 6
    收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值