上一篇我们讲了变量的寿命,知道了C语言的变量是有生命周期的。到了一定的时机它们所占用的内存就会被释放。接下来我们讲讲这些变量都存储在哪些地盘上以及它们各自的势力范围。 记得当年小编在看古惑仔时,每个帮派都有自己的名号地盘,洪兴、东星、三联帮、山口组这些名字估计跟小编一个年代的人都还记得。而在C语言中我们也为变量划分好了名号地盘也为它们划分好了势力范围。 程序中的地盘 代码区:存放我们程序代码的地方它是可共享的,并且是只读的。 数据区:存放已初始化的全局变量、静态变量(全局和局部)、常量数据。 BBS区:存放的是未初始化的全局变量和静态变量的。 栈区:由系统自动分配释放,存放函数的参数值、局部变量和返回值的地方,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须我们管理。 堆区:堆是由malloc()或calloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放由我们控制,如果我们不小心就会产生内存泄漏。 C语言中的四种名号 auto:只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定,auto标识的变量存储在栈区中,它的势力范围为一对{}内。 register:声明为register的变量系统会为其选择一个寄存器进行存储,它常驻在CPU的寄存器中,所以register变量将在很大程度上提高效率,因为它省去了由内存调入到寄存器过程中的好几个指令周期,它的势力范围也为一对{}内。 static:用来声明静态类型的变量,无论是全局的还是局部的,静态类型的变量都存储在数据区中,其生命周期为整个程序。如果是静态局部变量,其势力范围为一对{}内,如果是静态全局变量,其势力范围为当前文件。静态变量如果没有被初始化,则自动初始化为0。静态变量只能够初始化一次。 extern:用来声明在当前文件中引用但在当前项目中的其它文件中定义的全局变量。如果全局变量未被初始化,则编译时自动初始化为0,存在BBS区中;如果已经初始化,那么存在数据区中。全局变量,不管是否被初始化,其生命周期都是整个程序运行过程中。通常在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间。 这篇聊聊C语言-我的地盘我做主,就讲到这里。大家有什么不明白的或者有什么意见可以北京最好白癜风专科医院北京最好白癜风医院排名
|