关于全局变量的初始化问题与野指针
2016-12-20 15:45
405 查看
今天遇到一个小问题,定义一个全局的指针变量p1,并通过malloc动态分配内存的方法,将一块内存的首地址赋给p1。
代码如下:
但是使用 gcc 命令编译后报出如下错误(使用C99标准)
看了别人的博客后才知道是如下原因:
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)申请一块内存
3) 将p置为空指针
代码如下:
char *p1=malloc(1000);
但是使用 gcc 命令编译后报出如下错误(使用C99标准)
看了别人的博客后才知道是如下原因:
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,可能会访问非法的内存,产生段错误。
相关文章推荐
- 关于全局变量初始化与赋值问题的思考
- 关于全局、static对象/变量的初始化问题
- 关于C/C++中全局变量的初始化问题的深入思考
- 关于C未初始化全局变量的连接问题
- 关于全局变量指针直接 malloc分配内存的一些问题
- 关于对于c语言全局变量初始化问题
- 在Java中关于静态变量和全局变量什么时候初始化的问题
- 全局变量与局部变量初始化问题
- 51平台下初始化文件的引入导致全局变量无法初始化的问题
- 关于java中变量的初始化的问题
- 转载:关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 关于C++项目指针对象未被初始化的问题(0xcdcdcd)
- 关于struct 变量初始化和赋值的问题(vs 环境)
- [笔试题 9][c/c++]关于成员变量,对象成员的初始化问题
- 关于指针数组的初始化和输入 问题
- 关于c++的类中成员变量初始化问题+初始化列表中对应顺序问题!
- 关于进程和线程对于全局变量共享的问题学习总结
- 关于JAVA中变量的初始化及类属性的默认值问题
- C/C++关于全局变量和局部变量初始化与不初始化的区别
- 构造函数的职责 -- 关于全局变量的构造函数里执行太多复杂操作导致的问题