可以在C中返回并释放动态分配的数组吗?

use*_*359 4 c malloc function dynamic-arrays

是否可以返回并释放动态分配的数组?

int *mycopy(int *from, int len)
{
    int i;
    int *to;

    to = malloc(len*sizeof(int));

    for(i = 0; i < len; ++i) {
        to[i] = from[i]
    }

    return to;

    // how do I free the "to" array?
    // do i even need to, or does the array only have function scope
    // and get deleted when the function exits?
}
Run Code Online (Sandbox Code Playgroud)

或者是

void mycopy(int *from, int *to, int len);
Run Code Online (Sandbox Code Playgroud)

我唯一的选择?

mycopy函数只是一个简单的例子,但在实际代码中我想嵌套它们,比如调用它

a = mycopy(mycopy(b, 5), 5)
Run Code Online (Sandbox Code Playgroud)

每次调用函数时如何在不分配更多内存的情况下执行此操作?谢谢.

Jon*_*ler 6

如果返回数组,则调用代码必须负责释放它(并且该函数不能释放它).如果你不返回数组,该函数必须释放它,但无论如何该函数都是无意义的.因此,该函数不会释放数组.

如果您使用:

void mycopy(int *from, int *to, int len);
Run Code Online (Sandbox Code Playgroud)

调用代码必须进行内存分配.如果您使用:

void mycopy(int *from, int **to, int len);
Run Code Online (Sandbox Code Playgroud)

该函数可以进行分配 - 但它仍然不能释放它.

但最初的功能更好:写得很好.你可以这样称呼它:

int b[] = { 1, 2, 3, 9, 2 };
int *a = mycopy(b, sizeof(b)/sizeof(b[0]));
...use a...
free(a);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你不能将调用嵌套到你的复制功能 - 或者,至少,你不能用这个来做:

a = mycopy(mycopy(b, 5), 5);
Run Code Online (Sandbox Code Playgroud)

它可能会泄漏内存.如果你必须进行嵌套调用(为什么?),那么你需要:

int *c;
int *a = mycopy((c = mycopy(b, 5)), 5);
Run Code Online (Sandbox Code Playgroud)

但是写起来会更干净整洁:

int *a = mycopy(b, 5);
int *c = mycopy(b, 5);
Run Code Online (Sandbox Code Playgroud)

这样不容易出错,更容易理解,并且使用稍少的字符来启动!


Bas*_*Zen 5

如果你试图在同一个函数中返回并释放一个动态分配的数组,那么你就是自相矛盾的.堆(动态)分配的目的是创建一个在函数返回后持久存在的对象.接收方有义务在不再需要时将其释放.

现在,在您的嵌套示例中,内部mycopy(b, 5)引用被泄露; 你不是把它放在一个持久变量中.我不知道为什么它如此重要.但有趣的讨论,所以假设你坚持嵌套:为了避免内存泄漏,使之故数组的副本是一个是free()d 复制完成,所以只有副本生存.有趣!但是现在,除了浪费时间之外,代码仍然没有做任何事情.这让我们回过头来说:也许这是占位符代码.您可能正在尝试做一些有用的事情,但这里没有足够的信息来采取适当的更高级别视图并重新执行整个策略.