重庆网站开发小顶网,免费网站建设 免备案,青州网站建设推广,开发软件的公司叫什么首先要理解生存周期与作用域的区别#xff1a; 生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间#xff0c;而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁#xff0c;除了静态变量之外的局部变量都存放于栈中… 首先要理解生存周期与作用域的区别 生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁除了静态变量之外的局部变量都存放于栈中。 作用域: 变量的可见代码域块作用域函数作用域类作用域程序全局作用域。 static变量是指静态的变量不管是在全局还是局部声明的static变量都存放于程序的全局变量区域所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期它的作用域决定于它被定义的位置。可以认为static变量的作用域生存周期。 举一个局部声明的例子。在函数test中声明静态变量i void test() { int m3; static int i5; } 局部变量m存放在栈中当test函数结束m将被销毁静态变量i不存放在栈中而是存放于程序的全局变量区域因此随着函数test的结束它并不随着出栈操作而被销毁它的生存周期存在于程序的整个运行期然而m和i的作用域都仅存在于test函数中它们的定义之后即test调用结束之后m和i就不再可用但是i仍存在于内存之中。 再举一个全局声明的例子。在文件A 中定义静态变量j int n3; //默认为extern static int j5; //声明为static 全局变量和静态变量j都存放于程序的全局数据区域它们的生存周期都是程序的整个运行期但是n的作用域为全局作用域可以通过extern在其他文件中使用而j只能在文件A中使用例如在文件B中 extern int n; //ok extern int j; //error: j在文件B中不可见 int an;//ok但这里有个初始化先后的问题具体参见参考一 int bj;//error 也就是说在声明全局的static变量时static没有改变它的生存周期也即存储位置因为全局变量本来就存储在全局数据域而是将变量的作用域限制在当前文件中。 中兴通讯2012校招笔试题的一道问答题 1. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。 全局变量本身就是静态存储方式 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。 这两者的区别在于非静态全局变量的作用域是整个源程序 当一个源程序由多个源文件组成时非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域 即只在定义该变量的源文件内有效 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内只能为该源文件内的函数公用因此可以避免在其它源文件中引起错误。 static全局变量只初使化一次防止在其他文件单元中被引用; 2. static局部变量和普通局部变量有什么区别 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域限制了它的使用范围。 static局部变量只被初始化一次下一次依据上一次结果值 3. static函数与普通函数有什么区别 static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数)内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数应该在一个头文件中说明要使用这些函数的源文件要包含这个头文件. static函数在内存中只有一份普通函数在每个被调用中维持一份拷贝 P.S. C程序一直由下列部分组成 1正文段代码段——CPU执行的机器指令部分一个程序只有一个副本只读防止程序由于意外事故而修改自身指令 2初始化数据段数据段——在程序中所有赋了初值的全局变量存放在这里。 3非初始化数据段bss段——在程序中没有初始化的全局变量内核将此段初始化为0。这就是为什么全局内置类型变量会初始化而局部变量就为未初始化的未知值 4栈——增长方向自顶向下增长自动变量以及每次函数调用时所需要保存的信息返回地址环境信息。 5堆——动态存储分。 程序在内存中申请了代码段全局数据段初始化和未初始化栈和堆程序代码放于代码段全局变量和静态变量存放在全局数据段中一直存在直到程序结束而局部变量都放于临时的栈中随着作用域的结束随着出栈操作而销毁。malloc和new出来的内存不属于上面提到的程序申请的内存中而是在系统中申请到的内存所以如果在程序中没有明确free和delete的话程序结束后该内存仍不会被释放造成内存泄漏。例如 int test() { int * pnew int(3); } 则test函数结束后p指针本身被销毁因为它是存在于函数栈中的局部变量而p指向的int整型内容仍存在于内容堆中没有被释放造成内存泄漏。 详细内存使用和参考http://blog.csdn.net/cc198877/article/details/8849694 参考 http://www.cnblogs.com/jerry19880126/archive/2013/03/09/2951186.html http://www.cnblogs.com/jerry19880126/archive/2012/12/22/2829394.html http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html http://bbs.csdn.net/topics/350238100 转载https://blog.csdn.net/qibanxuehua/article/details/52702606 **应用static的延迟静态绑定 见https://blog.csdn.net/bloodperfect/article/details/52416837 转载于:https://www.cnblogs.com/bigclould/p/9322248.html