C语言 局部变量与全局变量的生存期
1.局部变量
仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。
2.局部变量的内存分配:
通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部变量所在的函数被调用时,系统根据需要临时为其分配内存。当函数执行结束时,局部变量被撤销,占用内存被收回。
注意:
局部变量在函数被调用时由系统分配存储区,在不同的声明周期的函数中同名的变量实际上在内存中占不同的单元,因此在不同的函数中可以定义相同名字的局部变量。生命周期相同的函数的同名局部变量,占用不同的内存单元。
总结:这种内存分配方式叫自动分配内存,对于自动分配(栈分配),变量与其所在的代码块共存亡。
补充:
对于静态分配(编译器预分配),变量与程序共存亡,程序开始执行时即已存在,一致到程序运行完毕退出后才撤销。
静态分配,生命周期就是整个程序执行周期,内存会一直存在,main函数执行之前就创建,无论函数如何运行,如何调用,内存一直不会被回收,一直到程序结束才被系统回收。
动态分配的生存期,从malloc开始,free结束。
动态分配和静态分配的区别:
静态分配一般在栈上,系统自己分配和回收内存。动态分配在堆上,由程序员自己决定分配和回收内存。
3.全局变量
在函数外定义的变量称为全局变量,也称外部变量,全局变量的作用域较广,全局变量不属于任何一个函数,理论上可被其作用域中的所有函数访问,因此,提供了一个不同函数间联系的途径,使函数间的数据联系不只局限于参数传递和return语句。
全局变量的作用域就是从其定义处到源文件结束,调用全局变量不能超出其作用域。
全局变量一经定义,编译器会为其分配固定的内存单元,在程序运行期间,这块内存单元始终有效,一直到程序执行完毕才由操作系统收回该块内存。