全局与静态的博弈

内存中的程序

  • 只读部分
  • 程序中的代码
  • 程序中的常量
  • 可读写部分
  • .data: 初始化了的全局变量和静态变量
  • .bss(Block Started by Symbo):未初始化的全局变量和静态变量
  • heap: 使用 malloc, realloc, 和 free 函数控制的变量
  • stack: 函数调用时使用栈来保存函数现场,自动变量

静态变量 & 全局变量

全局变量:代码中的变量,要么定义在函数外,要么定义在函数里。定义在函数外的变量就有了全局的作用域,成了全局变量,全局变量不仅在整个文件中有作用,而且在其他文件中也有作用,称作链接性

a.c

#include <stdio.h>

int a;

int compute(void);

int main()
{ 
  a = 1; 
  printf("%d %d\n", a, compute()); 
  return 0;
}

b.c

int a;
int compute(void)
{ 
  a = 0; 
  return a;
}

在链接过程中会产生重复定义错误,原因是有两个全局变量a,为了避免这种情况,需要引入static

静态变量:指使用 static 关键字修饰的变量,static 关键字对变量的作用域进行了限制,使得变量仅在源文件内有效。

  • static在函数外:static全局变量
  • static在函数内:static局部变量

对于static局部变量,在其他文件调用本文件内函数修改其值时候,变量的值不会丢失;普通局部变量都是重新分配,而静态局部变量保持上次调用的值不变。

注意:'静态'这个中文翻译实在是有些莫名其妙,给人的感觉像是不可改变的,而实际上 static 跟不可改变没有关系,不可改变的变量使用 const 关键字修饰,注意不要混淆。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容