对于返回局部指针变量的思考
来源:百度文库 编辑:神马文学网 时间:2024/05/06 14:14:00
我们大家都知道指针函数的返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象能够返回其地址,而什么样的对象不能够返回其地址?静态变量与局部自动变量的主要区别是什么? 要想明白这些就需要理解程序的内存布局情况 程序的存储区域分为:代码段、只读数据段、已初始化的读写数据段、未初始化的数据段、堆、栈。 1、代码段、只读数据段、已初始化的读写数据段、未初始化的数据段都属于静态区域。 2、堆内存只在程序运行时出现,一般有程序员分配和释放。 3、栈内存只在程序运行时出现,在函数内部使用的变量,函数参数以及返回值将使用栈空间。 到底存储在静态区域和存储在栈区域的对象在返回指针的函数中有什么本质区别,为什么存储在静态区域的静态变量就能够返回其地址,而存储在栈区域的自动变量不能返回其地址? 主要在于他们的管理机制不同,存储在静态区域的对象的生存周期是主函数的生存周期,而存储在栈区域的对象生存周期为指针函数开始运行到指针函数结束,当指针函数结束时存储在栈区域的对象生存周期也就结束,其地址也变成无效地址。栈空间由编译器自动分配和释放,函数结束时其栈空间释放内存。堆区域一般由程序员来控制其生存周期。因此,指针函数返回的指针能够指向静态区域的变量而不能指向自动局部变量。 当函数使用指针作为返回值时,它可以指向静态区域的地址,可以指向堆内存的地址,也可以指向函数调用者的栈空间,但是它不可以指向一个函数内部栈内存的地址。 因此,能不能返回局部指针变量,不在于这个指针变量的类型和性质(不在于该指针是不是局部指针变量),而在于该指针指向的对象的类型和性质。如果该指针指向函数内部的栈空间,则程序非法,如果指向静态区域的地址,则合法。 因此,判断指针函数返回值是否合法,应该首先看看该返回指针变量指向的对象的存储区域,即该指针指向的区域。透过现象看本质,不同区域的对象本质区别在于其的生存周期的有效性不同,判断返回的指针值是否有效合法,最本质应该看看该指针指向的对象的生存周期在函数结束后是否有效。如果该对象的生存周期长于指针函数的生存周期,则该指针返回值合法,否则,该指针的值为非法地址。即使该指针指向堆区域的地址但在指针函数结束时,堆已释放,则该函数的返回地址仍为非法。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinlei2009/archive/2010/07/18/5744875.aspx
对于返回局部指针变量的思考
多维数组的指针变量
多维数组的指针变量
局部变量与栈
对于国企改革的思考
对于国企改革的思考
在线学习-第八章 指针 8.6.2 指针作为函数的返回值
对于呼叫中心的思考
关于指针强制类型转换的思考
《Java最佳实践》之用局部(堆)变量代替实例(类)变量- - - Rinso的专栏 - ...
关于常数型指针变量的用法,做为一个知识点分享给大家
对于电子商务的思考 - Joy - 网易博客
对于中国未来的脑残式思考
对于用神的理解和思考
对于美元下跌的一点思考
对于企业财务分析方法的一些思考 -
对于程序化交易的点滴思考
对于C语言中指针和数组的认识和看法
C++ 全局变量、静态全局变量和静态局部变量的异同?能结合代码详细分析一下吗?谢谢 - 已...
对于2006年会计准则变化的思考
对于2006年会计准则变化的思考
胆战心惊:对于ADSE这本书的思考
对于2006年会计准则变化的思考
对于课堂教学有效性的几点思考3