学习笔记之C语言变量作用域、生命周期

变量的存储位置

1. 变量的作用域

  变量的作用域 和其编译阶段有关,如果超出作用域,就会导致编译错误。即 -s 文件名时会出错。
  基于全文件的作用域,这种全局变量需要用到多文件编译。(初学者不要定义这样的全局变量,会让代码变得非常复杂,Debug不好处理。)
  基于本文件的作用域,这种一般称为静态全局变量,只和这个文件相关,其他文件无法使用。
  函数内的局部变量,只能在本函数中使用,其他函数中无法使用。
  基于域的局部变量,只能在域中使用,域外部无法使用。

  变量的作用域范围为变量的定义或者扩展定义开始,直到域结束为止。

  扩展作用域一般使用extern关键字在需要的位置进行拓展。如果使用extern对局部变量进行扩展作用域,将会导致链接的过程中找不到该变量 出现链接错误。
  这是因为 extern只会扩充作用域,但是局部变量在对应的局部域中没有真正定义,从而出现找不到实体的链接错误。

  extern只是声明不定义,不在内存中申请空间。

声明和定义的区别

  声明,指定了一个变量的标识符,用于编译器识别变量名所引用的实体。定义是对声明的实现或实例化。链接器需要用定义来引用内存实体。
  如果只是为了给编译器提供引用标识,让编译器能够知道有这个引用,能用这个引用来引用某个实体(但没有为实体分配具体内存块的过程)是为声明。如果该操作能够为引用指定一块特定的内存,使得该引用能够在link阶段唯一正确地对应一块内存,这样的操作是为定义。
  声明是为了让编译器正确处理对声明变量和函数的引用。定义是一个给变量分配内存的过程,或者是说明一个函数具体干什么用。

2.变量的生命周期

  变量的生命周期和程序运行阶段有关,如果超出生命周期,就会导致运行错误
  对于非静态局部变量,我们一般称其定义的位置在栈区。栈区的特点是当对应的域结束时,系统会对这块空间进行释放。释放即允许其他程序或内容对他再次编写。
  另外可以手动申请把变量存放到堆区,堆区需要手动进行释放。
  可通过static关键字声明变量存放在静态区。静态区是和整个程序相关的,程序结束,它才会被释放。
  全局变量,自带静态特性。

   生命周期的开始为:变量的定义;结束为:变量的空间的释放。

  static 针对生命周期,使其声明的变量存放到静态区。针对作用域,其表示限定作用域。比如在某些.c文件中定义的函数,添加static,限定该函数只能用于当前的.c文件。
  形参是对应的局部作用域范围中最广的。同理for循环变量声明也是局部域当中范围最广的。

int main(int argc, char const *argv[]);

  以上函数声明中的参数代表命令行中输入的命令参数。argc代表参数个数,argv[]代表参数值。
  平时我们需要在linux系统下输入很多指令,比如

chmod +x var.c

  其中chomd是主指令,后面跟着的两个是参数。可以通过我们自定义的可执行文件对它进行处理,是一种写自定义指令的方式。比如

man --help

  它通过调用自己的可执行文件来完成对应的事。
  参考https://jingyan.baidu.com/article/020278118e51e01bcd9ce576.html

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

友情链接更多精彩内容