C语言作用域与内存结构

C语言作用域

  • 一共分为三种:
    ** 代码块作用域,即一个单独的{}抱起来的代码块部分
    ** 函数作用域,函数内部代码块
    ** 文件作用域,一个.c或.h文件内部

全局变量与局部变量

  • 局部变量就是在{}中的变量,比如函数中定义的,或者形参等。其生命周期即从创建到函数结束。
  • 全局变量即不再任何{}中的变量,其生命周期是从程序运行一直到结束。
  • 全局变量可以跨文件使用。即如果在C语言源文件t1.c中定义了变量a,可以在源文件t2.c中使用t1.c中的变量a,并且不用导入t1.c。t2.c中只需要在使用a之前声明一下,即 extern int a。该声明意味着变量a是在其它文件中定义的变量。因为全局变量可以跨文件使用,所以不同文件中不能有相同名称的全局变量
  • 当然,所有函数都是全局的,可以跨文件使用,如果要在一个文件中使用另一个文件中定义的函数,也是只需要声明即可。
  • 跨文件编程的时候,一般常用函数和变量放在一个源文件中,函数和变量的声明放在一个头文件中,而在主文件中使用这些函数时只需要导入头文件,在预处理阶段会将头文件展开,即将函数和变量的声明复制到了主文件中。

静态变量

  • 用static修饰的变量即为静态变量
  • 静态变量作用有三个,一是使得该变量只能初始化一次,二是限定全局变量的作用域,三是延长局部变量的声明周期。

静态局部变量

  • 用static修饰局部变量,此时该变量只能初始化一次,比如在一个函数中定义了一个静态局部变量,即使多次调用该函数,也只初始化一次,从第二次调用该函数开始,静态局部变量的初始化语句都会被跳过执行。
  • 静态局部变量的声明周期变成了从初始化一直到程序运行结束。

静态全局变量

  • 本来全局变量作用域是跨文件的,但是用static修饰之后将其作用域限定在了本文件内。

总结表

内存四区模型

概论

  • C语言的内存四区模型,是在编译阶段确定的,其实本质上是汇编阶段吧,把程序指令代码都放在代码区,把生命周期是从程序运行到结束的数据都放在数据区。栈区中的内容是动态变化的,毕竟,一个程序的执行过程可以认为是一个个函数的调用过程,首先开始运行的当然是主函数,注意,每个函数对应的指令都在代码区,然后当调用某个函数的时候,就会在栈区给该函数分配一块区域,用来放该函数中的一些局部变量等数据,当该函数执行完毕后,栈区就释放了。需要注意的是,由于栈区通常很小,可能只有1M,因此只有C语言中将数组放在了栈区,太容易爆栈了。

程序运行之前

  • 在程序编译好之后,运行之前,只有代码区(text)和数据区,其中数据区可以分为初始化的数据(data)和未初始化的数据(bss),从另一个角度也可以分为静态区,全局区,以及常量区(常量区中的内容一旦初始化就不可改变,注意const全局变量在常量区,但是const局部变量在栈区,const全局变量永远都不能修改,const局部变量虽然不能用变量名直接修改,但是可以用指针间接修改),当然这种分类不是严格的。

  • 为什么程序运行之前就会分区呢?其实是在汇编阶段实现的,我们知道汇编语言中可以用段寄存器CS、DS等来指定某段内存是代码段、数据段,这就是C语言中的代码区、数据区等,因此当编译成汇编语言的时候,其实就已经有了这些区。

  • 为什么说全局变量和静态变量是在编译阶段分配内存的?其实这里分配的只是地址而已,并没有真正地分配内存空间。分配的是虚拟地址。

程序运行之后

  • 在程序运行起来之后,会加上堆区和栈区。

栈区

  • 是一种先进先出的数据结构,每个函数对应了自己的调用栈。刚开始肯定是主函数main,然后将主函数中响应的局部变量压入主函数栈,然后主函数中如果调用了其它子函数,则系统给子函数分配自己的栈区,在里边给子函数的局部变量分配内存空间。当子函数执行完毕,则将栈区对应的东西出栈即可。
  • 栈空间由系统自动开辟和释放,不用用户控制。
  • 栈空间非常小,1M差不多,因此存放写变量之类的还行,像数组、字符串之后的东西就不合适了。

堆区

  • 堆区由程序员手动申请,手动释放,若不手动释放,则程序运行结束后由系统回收,生命周期是整个程序运行期间(注意,即便是子函数中申请的堆空间,子函数返回之后也不会自动释放,也是要等到整个程序运行结束)。

总结

posted @   肖肖凯  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示