在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]
}
//...