在 c 中使用 malloc 时的自由变量

free variable when use malloc in c

char **loadValues()
{
    char **toReturn;
    int i;
    toReturn = malloc(5 * sizeof(char *));
    for (i = 0; i < 5; i++)
    {
        toReturn[i] = malloc(25);              //Change the size as per your need
        strncpy(toReturn[i], "string", i + 1); //Something to copy
    }
    return toReturn;
}

我复制了上面的部分代码。其中,“toReturn”变量使用 malloc 进行初始化。难道我们不必“释放”这个“toReturn”变量吗?

当我们在 C 中 return 时,我们是否必须释放这些变量。我仍然找不到明确的答案,当我 [=16] 时,我找不到释放它的方法=] 它。有人可以给我解释一下吗?

您不能释放函数内部分配的内存和 return 该数据,以便它可以在函数外部使用。但是你仍然可以free()函数外的内存。

我假设您的问题是:调用 loadValues 并接收其指针 returns 的函数如何释放加载的值。

如果我们让 loadValues 保持原样,最好的解决方案是创建另一个函数,称为 freeValues 并在我们完成值时调用它:

void freeValues(char **values)
{
    for (i = 0; i < 5; i++)
    {
        free(values[i]);
    }
    free(values);
}

然后你可以在你的主程序中做这样的事情:

char **values = loadValues();
// ... use values for something
freeValues(values);

另一种选择是使用对 malloc 的单个调用来分配 toReturn,在这种情况下,只需调用 free.

即可释放它

Don't we have to "free" this "toReturn" variable?

是的,最终你会想在用完之后释放内存。

I still couldn't find clear answer and I can't find a way to free it when I return it. Can someone explain it to me?

当你使用函数时,你将它赋值给一个新的指针,你可以使用这个指针,不仅可以访问你返回的内存块,还可以释放它,例如:

int main()
{
    char** values = loadValues();
    
    // do something with values

    // don't need them anymore
    for (int i = 0; i < 5; i++){
        free(values[i]);
    }
    free(values);
}

请注意,strncpy(toReturn[i], "string", i + 1); 可能不是您想要的,在每次迭代中,您只分别复制 1 到 5 个字符,而不是整个字符串,更重要的是,不是空终止符。

strncpy 的第三个参数应该是 "string" 的长度加上空终止符的 1 个字节,因此在本例中为 7。或者,如果只想复制该字符串的一部分,您必须自己以 null 结尾。

如果目标是复制整个字符串,您可以让编译器为您完成:

//...
toReturn = malloc(5 * sizeof(char *));
for (i = 0; i < 5; i++)
{
    toReturn[i] = strdup("string");  // duplicate string and store it in toReturn[i]
}
//...

当然还是需要像第一种情况一样自己释放。