6.1 全局变量
来源:互联网 发布:java开发常见问题 编辑:程序博客网 时间:2024/05/30 04:27
1.全局变量
- 定义在函数外面的变量
- 全部变量有 全局的生存期和作用域
- 它们与任何函数都无关
- 在任何函数内部都可以使用它们
2.全局变量初始化
- 没有做初始化的全局变量会得到0值
- 指针会得到NULL值
- 只能用编译时刻已知的值来初始化全局变量
- 它们的初始化发生在main函数之前
#include<stdio.h>int f(void);int gAll;// int gAll = f(); //[Error] initializer element is not constant//int g2 = gAll;//[Error] initializer element is not constant//const int g1 = 12;//int g3 = g1;//[Error] initializer element is not constant//int g4 = g5;// [Error] 'g5' undeclared here (not in a function)//const int g5 = 5;int main(int argc, const char *argv){ printf("gAll = %d\n", gAll); // gAll = 0 return 0; } int f(){ gAll +=2;}
3.被隐藏的全局变量
- 函数内部存在 与 全局变量 同名的变量,则全局变量被隐藏
#include<stdio.h>int f(void);int gAll;int main(int argc, const char *argv){ printf("gAll = %d\n", gAll); // gAll = 0 f(); printf("after call f(), gAll = %d\n", gAll); // after call f(), gAll = 0 return 0; } int f(){ int gAll = 12; printf("f() gAll = %d\n", gAll); // f() gAll = 12}
4.静态本地变量
- 在本地变量定义时 加上static修饰符 就成为静态本地变量
- 当函数离开的时候,静态本地变量会继续存在 并保持其值
- 静态本地变量的初始化 只会在第一次进入这个函数时做,以后进入函数时 会保值上次离开的值
#include<stdio.h>int f(void);int main(int argc, const char *argv){ f();// in f all = 1 again in f all = 3 f();// in f all = 3 again in f all = 5 return 0; } int f(){ static int all = 1; printf("in %s all = %d\n", __func__, all); all +=2; printf("again in %s all = %d\n", __func__, all); return all;}
- 静态本地变量实际上是特殊的全局变量
- 它们位于相同的内存区域
- 静态本地变量 具有全局的生存期,函数内的局部作用域
#include<stdio.h>int f(void);int gAll = 12;int main(int argc, const char *argv){ f(); return 0; } int f(){ int k = 0; static int all = 1; // 从地址看,静态本地变量是 全局的 printf("&gAll=%p\n", &gAll);// &gAll=0000000000403010 printf("&all=%p\n", &all); // &all=0000000000403014 printf("&k=%p\n", &k);// &k=000000000022FE1C printf("in %s all=%d\n", __func__, all); // in f all=1 all += 2; printf("after +2, in %s all=%d\n", __func__, all); // after +2, in f all=3 return all;}
5. 关于函数输入输出的问题
5.1 返回指针的函数
- 返回本地变量的地址是危险的
- 返回全局变量 或 静态本地变量的地址 是安全的
- 返回在 函数内malloc的内存是安全的,但是容易造成问题
- 最好的做法是 返回传入的指针
#include<stdio.h>int* f(void);void g(void);int main(int argc, const char *argv){ int *p = f(); printf("*p=%d\n", *p); // *p=12 g(); // k=24 printf("*p=%d\n", *p); // *p=24 return 0;}// 返回本地变量的地址是危险的 int* f(void){ int i = 12; return &i; // [Warning] function returns address of local variable [-Wreturn-local-addr]}void g(void){ int k = 24; printf("k=%d\n", k);}
5.2 tips
- 不要使用全局变量来在函数间传递参数和结果
- 尽量避免使用全局变量
- 使用全局变量和静态本地变量的函数 是 线程不安全的
0 0
- 6.1 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- 全局变量
- onWindowFocusChanged重要作用
- 文件上传-uploadify控件的使用
- ViewPager嵌套ViewPager的冲突解决
- mac下解压bin文件
- Android 网络请求框架对比分析
- 6.1 全局变量
- js基础2应用案例
- [Java]Thread类run()和start()
- Qt creator使用快捷键和自动补全功能的设置
- leecode 解题总结:274. H-Index
- DB2扩大事务日志
- Extjs弹出window窗口后背景窗口变灰(即不可编辑)
- FilenameFilter
- Java进阶-MySql数据库基础入门