从C函数返回一个局部variables

#include <stdio.h> int foo1(void) { int p; p = 99; return p; } char *foo2(void) { char buffer[] = "test_123"; return buffer; } int *foo3(void) { int t[3] = {1,2,3}; return t; } int main(void) { int *p; char *s; printf("foo1: %d\n", foo1()); printf("foo2: %s\n", foo2()); printf("foo3: %d, %d, %d\n", p[0], p[1], p[2]); return 0; } 

当我使用gcc -ansi -pedantic -W -Wall进行编译时,编译器为foo2()和foo3()发出警告消息:

 warning: function returns address of local variable 

我认为这是不允许返回一个局部variables,但foo1()工作正常,似乎有一个巨大的区别返回指向本地对象和对象本身。

有没有人可以解释这个问题? 提前致谢!

这里的问题是,当你创build本地variables时,它被分配到堆栈上,因此,一旦函数完成执行(实现在此变化),就不可用。 最好的方法是使用malloc()来保留非本地内存。 这里的危险是你必须释放( free() )你使用malloc()分配的所有东西,如果你忘记了,你创build一个内存泄漏。

对于foo1() ,您返回本地variables的副本 ,而不是本地variables本身。

对于其他函数,您返回一个指向局部variables的副本。 但是,该函数完成后,该局部variables将被释放,所以如果您之后尝试引用该variables,则最终会出现令人讨厌的问题。

任何variables在内存中都有一些空间。 一个指针指向这个空间。 当函数调用返回时,局部variables占用的空间被释放,这意味着它可以并将被重用于其他事情。 因此,引用这个空间将会指向完全不相关的东西。 C中的数组是作为指针来实现的,所以这适用于它们。 在函数中声明的常量数组也被视为本地的。

如果你想使用一个数组或其他指针超出它所创build的函数的范围,你需要使用malloc来为它保留空间。 使用malloc保留的空间不会被重新分配或重用,直到通过免费调用被明确释放。

是的,你正在返回一个数组,它实际上是一个指针,在你的初始化variables的内容被存储的内存地址的地址。 所以这是警告你可能不是那么有用的返回这样的结果,当你可能真的意味着一个数组值。