C语言初学者,记得学数据结构的时候,在操作动态链表,栈,队列时经常用指针作为函数参数和返回值,但是自己做练习时尝试的一个小程序却总提示 【Warning】address of local variable ‘某变量’ returned [-Wreturn-local-addr] 痛苦的排查了半天,终于找到了在一篇博文中找到了答案,赶紧趁热总结一下!
先看一下这个警告:一个指向局部变量(local variable)的指针作为了函数的返回值!问题就出在这了。
局部变量(也叫自动变量)从形式上看就是写在了于某一函数内部,当然也包括main函数。只有在调用某一函数时,其中的局部变量才被自动地分配存储空间,这里的存储空间指内存中的动态存储区,也就是我们常说的栈中。因此,如果函数返回的指针指向了这样一个局部变量,那么函数执行完毕后,指针原本指向的存储区域其实已经被释放,此时的指针的返回值带回的是一个无用的地址!
好的,现在清楚了不能把指向局部变量的指针作为函数返回值!但是我们绝对可以肯定的是存在指针函数(返回值为指针类型的函数),那能够作为函数返回值的指针应该满足什么条件呢?
函数调用结束后,指针所指向的数据存储区仍然存在,可用就可以!这样的存储区主要有:
1、内存中静态存储区。这里开辟的存储空间在程序运行期间一直存在,并且对所有函数可见。因此可以把局部变量定义为静态局部变量,如:static int a;
当然定义为全局变量,不过大多时候一个全局变量,也就不需要再作为返回值出现了。
2、也可以用随时使用随时开辟的(通常用malloc函数申请)临时存放数据的堆区。在这里开辟的存储空间没有变量名,只能通过地址去调用,用完之后手动free()才会释放这一空间。C语言中动态链表或者可变数组正是这样实现的。