1

下面的案例让我更加困惑。据我所知,局部变量不会通过指针或引用返回。例如

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

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

在这两种情况下会发生什么?

4

3 回答 3

5

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

来自 C++ 标准部分 lex.string:

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

于 2013-04-24T03:30:27.740 回答
0

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

const char*

是的,您可以返回static变量的地址:它们在函数返回时不会被破坏,因为它们位于静态数据内存段中

于 2013-04-24T03:52:25.050 回答
0

第一个代码不会编译。您可以将字符串转换为 char 数组并返回。第二个代码将编译,但您的变量将超出范围。因此,当函数返回时您将拥有的引用将不再有效。按地址返回局部变量是不好的。想要这种行为有什么具体原因吗?

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

希望这可以帮助。

于 2013-04-24T03:34:18.697 回答