在 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]
}
//...
当然还是需要像第一种情况一样自己释放。
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]
}
//...
当然还是需要像第一种情况一样自己释放。