在C中返回堆栈数据; 它是否正确无法分配?

4 c c++ stack allocation release

我正在审查一个朋友的代码,并就C/C++如何在堆栈上分配内存并管理其发布进行了一场有趣的辩论.如果我要在一个函数中创建一个包含10个对象的数组,但是返回所述数组,它会在函数弹出时释放(从而使给定的数据无效),还是放入堆中(这引发了我们如何解决的问题)释放它?).

示例代码如下:

Gene* GetTopTen()
{
    // Create 10 genes (or 10 objects, doesn't matter)
    Gene Ten[10];

    // Sort out external pool data
    Sort();

    // Copy over data to the array of 10 objects
    for(int i = 0; i < 10; Ten[i++] = pool[i]);

    // Here is the core of my question:
    return Ten;
}
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助,这变成了一个非常有趣的问题,我的朋友和我无法回答.

smo*_*gan 22

这是一个堆栈分配的数组,因此返回的指针无效.

  • 而且,一个好的编译器会警告这种情况. (3认同)

Zif*_*fre 9

函数返回后,数据不会被破坏,但可能会被下一个函数调用覆盖.你可能会很幸运,它可能仍然存在,但它是未定义的行为.你不应该依赖它.

以下是可能发生的情况:在函数期间,堆栈如下所示:

"---------------------------
| caller function's data   |
----------------------------
| Ten[9]                   |
| Ten[8]                   |
| ...                      |
| Ten[0]                   |
---------------------------"
Run Code Online (Sandbox Code Playgroud)

函数退出后,它可能会立即显示相同的内容.但是如果调用者调用这样的另一个函数,

void some_func() {
    Gene g;
    ...
}
Run Code Online (Sandbox Code Playgroud)

堆栈现在看起来像这样:

"---------------------------
| caller function's data   |
----------------------------
| g                        |
----------------------------
| Ten[8]                   |
| ...                      |
| Ten[0]                   |
---------------------------"
Run Code Online (Sandbox Code Playgroud)

某些数据可能会被静默覆盖(​​在这种情况下是这样Ten[9]),并且您的代码不会知道它.您应该在堆上分配数据malloc()并显式释放它free().