2013-04-24 79 views
1

以下情况会让我更加困惑。据我所知,局部变量不会被指针或引用返回。例如功能返回指针

char * foo() 
{ 
    return "Hello world"; 
} 

int* fooo() { 
    static int i = 100; 
    return &i; 
} 

这两种情况会发生什么?

+1

第一个不应该在现代C++中干净地编译。 – chris 2013-04-24 03:28:34

+0

这意味着,像这样返回是一个标准方法? – Srijeyanthan 2013-04-24 03:40:14

+2

我不会说这是“标准”。这是合法的,但这不是通用惯例。你能否给我们提供更多关于你想要完成的内容的信息,以及为什么你认为你需要编写这些代码? – 2013-04-24 03:40:41

回答

5

字符串文字是静态存储的,当然static int i也是静态的。您可以从函数返回指向静态变量的指针,因为它们不是局部变量,并且当您像堆栈分配变量一样退出函数时它们不会被销毁。在另一方面,你的第一个例子应该返回const char *

从C++标准节lex.string:

字符串文字......具有类型为“n为const char数组”和静态存储持续时间(basic.stc),其中n是如下面所定义,并且与给定的字符初始化的字符串的大小...

+0

感谢您的详细解释 – Srijeyanthan 2013-04-24 03:57:33

+0

答案也提到它,“当然'static int i'也是静态的。您可以安全地返回指向所有静态变量的指针。 – perreal 2013-04-24 03:58:42

0

第一代码不能编译。您可以将该字符串强制转换为char数组并返回。第二个代码将被编译,但是你的变量将超出范围。因此,函数返回时的引用将不再有效。通过地址返回一个局部变量是不好的。是否有任何特定的原因想要这种行为?

你可以new/malloc一个char数组或int,然后返回它。只要您不手动释放/删除内存,就可以保证范围内存在变量。然后,您可以愉快地从其他功能访问内存。

希望这会有所帮助。

+3

第二种情况下的变量是'static'。 – jogojapan 2013-04-24 03:36:33

+0

我没有看到...静态变量对函数不是本地的,所以你仍然有静态变量的有效内存。但是,不应该有任何需要返回来自任何函数的静态变量的地址,因为它们可以在定义它的整个类中访问。 – Bill 2013-04-24 03:38:33

+3

您在函数范围内将类作用域中的'static'与'static'混淆。 – 2013-04-24 03:39:33

0

你的第一个功能是无效的,你应该返回

const char* 

,是的,你可以返回static变量不会忽略:当函数返回,因为他们在静态数据存储段被alocalted它们不被破坏