C语言-变量生存期及作用域

1 变量的生存期和作用域

  • 变量的储存方式:动态储存(自动、寄存器)、静态储存(静态和外部)
储存方式名称
自动变量anto
寄存器变量register
静态储存static
外部变量extern
  • 基本类型的静态变量(static)系统初始值为 0,全局变量也会自动初始化0
  • extern声明外部变量时,类型名可以写也可以不写,如extern int A,B,C,也可以写成extern A,B,C,因为它不是定义变量,可以不指定类型,只需写出外部变量名即可。
  • 若希望某些外部变量只限于本文件引用,而不能被其他文件引用,可以在定义外部变量时加一个static声明,如static int A;,那么在其他文件引用extern A就会报错。
  • 对局部变量声明static,作用是把它分配在静态内存,它在整个程序执行过程中不会被释放。对全局变量声明static,则限定该变量作用域只限于本文件。
  • 若要求函数只能被本文件内调用,称为内部函数,在定义内部函数时,加上static即可。
  • 若要定义外部函数,加上extern即可,但C语言默认不加static的就会外部函数,可以被其他文件调用。
  • Stack (栈内存):主要是用来存储 function calls(函数调用)和 local variables(局部变量) 的空间,其本质就是一个 Stack(栈)。最底层的便是 main() 函数,每调用一个函数时就会执行 push 操作,每当函数 return 时便执行 pop 操作。什么时候 main() 也被 pop 了,整个程序也就结束了。(如果这个 stack 变得太高以至于超出了最大内存地址,就会出现所谓的 stackoverflow

  • HEAP(堆内存):主要是用来存储由 malloc() 等申请的内存位置。如果 malloc() 返回 null 的话就往往表示这一块空间已经用完了。

  • Static (静态内存):这里的变量的生命周期与整个程序相同,即在进程创建是被申明,在程序退出时被销毁。global variables(全局作用域变量), file scope variables(文件作用域变量)和被 static 关键字修饰的变量会存在这里。

2 默认初始化规则(C++11)

  • 栈中的变量(函数体中的自动变量)和堆中的变量(动态内存)会保有不确定的值;
  • 全局变量(静态内存)和静态变量(包括局部静态变量,静态内存)会初始化为零。

C++11: If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2.

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值