在c中使用malloc时的自由变量 char**loadValues() { 字符**返回; int i; toReturn=malloc(5*sizeof(char*)); 对于(i=0;i

在c中使用malloc时的自由变量 char**loadValues() { 字符**返回; int i; toReturn=malloc(5*sizeof(char*)); 对于(i=0;i,c,malloc,free,C,Malloc,Free,我复制了上面的部分代码。其中,使用malloc初始化“toReturn”变量。我们不需要“释放”这个“toReturn”变量吗 当我们用C语言返回这些变量时,我们不需要释放它们吗?我仍然找不到一个明确的答案,也找不到在返回时释放它们的方法。有人能给我解释一下吗?您不能释放函数内部分配的内存并返回数据,以便在函数外部使用。但是您仍然可以释放()函数外部的内存。我假设您的问题是:调用装入值并接收其返回的指针的函数如何释放装入的值 如果我们保持loadValues现在的状态,最好的解决方案是创建另一个

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


当我们用C语言返回这些变量时,我们不需要释放它们吗?我仍然找不到一个明确的答案,也找不到在返回时释放它们的方法。有人能给我解释一下吗?

您不能释放函数内部分配的内存并返回数据,以便在函数外部使用。但是您仍然可以
释放()
函数外部的内存。

我假设您的问题是:调用
装入值并接收其返回的指针的函数如何释放装入的值

如果我们保持
loadValues
现在的状态,最好的解决方案是创建另一个名为
freeValues
的函数,并在处理完这些值后调用它:

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;
}
另一个选项是使用对
malloc
的单个调用分配toReturn,在这种情况下,只需调用
free
即可释放它

我们不需要“释放”这个“toReturn”变量吗

是的,最终你会想在完成后释放内存

我仍然找不到明确的答案,我也找不到一个方法来释放它,当我返回它。有人能给我解释一下吗

当您使用将其分配给新指针的函数时,您可以使用此指针,不仅可以访问返回的内存块,还可以释放它,例如:

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

当然,您仍然需要像第一种情况一样自己释放它。

如果您使用的是现代操作系统,并且不需要多次使用
loadValues()
,那么您不必使用
free()
。另一个条件是,您不必满足Valgrind这样的检查。释放要返回的内容是一个坏主意,因为返回意味着稍后将使用它,并且使用释放的缓冲区是非法的。这就像将您以前的电话号码提供给询问您号码的人一样:隐藏的危险。如果函数
strncpy()
达到
count
限制,则它不提供空终止符,并且
malloc()
不初始化它提供的内存。所以没有终结者,谢谢大家。我学到了更多的东西。旁白:本着
freeholl)
的精神,建议容忍
freeholues(NULL)
。非常感谢。我明白了。这是正确的,祝贺你的第一个答案,以及你的第一次投票。非常感谢:)非常感谢。我知道了。非常感谢你的回答。我明白了,学到了更多的东西。
char **values = loadValues();
// ... use values for something
freeValues(values);
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);
}
//...
toReturn = malloc(5 * sizeof(char *));
for (i = 0; i < 5; i++)
{
    toReturn[i] = strdup("string");  // duplicate string and store it in toReturn[i]
}
//...