【问题标题】:Function return pointer [duplicate]函数返回指针[重复]
【发布时间】:2013-04-24 03:25:51
【问题描述】:

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

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

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

这两种情况会发生什么?

【问题讨论】:

  • 第一个在现代 C++ 中不应该编译干净。
  • 也就是说,这样返回是标准方法?
  • 我不会说它是“标准的”。这是合法的,但不是惯例。您能否向我们提供更多信息,说明您要完成的工作以及您认为需要编写此代码的原因?
  • 非常感谢,基本原因是函数执行后通过指针或引用返回局部变量无效。所以在这里,我们返回该函数本地的“hello world”,所以我关心的是,一旦函数超出范围,该位置是否有效?
  • 但是有更好的方法来实现这一点。例如,像"Hello world" 这样的常量值可以声明为与您的函数在同一范围内的常量:const char* foo = "Hello world"; 您根本不需要该函数。

标签: c++ pointers


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的详细解释
  • 答案也提到了,“当然static int i 也是静态的”。您可以安全地返回指向所有静态变量的指针。
【解决方案2】:

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

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

希望这会有所帮助。

【讨论】:

  • 第二种情况的变量是static
  • 我没有看到...静态变量不是函数的本地变量,因此您仍然有静态变量的有效内存。但是,不需要从任何函数返回静态变量的地址,因为它们可以在定义它的整个类中访问。
  • 您将类范围内的 static 与函数范围内的 static 混淆了。
  • 是的,很抱歉。是的,函数内的静态变量具有整个程序的生命周期。但是,我认为返回静态函数级变量是一种不好的做法。感谢您指出。
【解决方案3】:

你的第一个函数无效,你应该返回

const char*

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2015-01-02
    • 2018-03-23
    相关资源
    最近更新 更多