我制作了一个简单的基本转换器,它所做的第一件事就是从用户那里获取一个字符串。我希望字符串是动态的,所以我这样做了:
char *getStr() {
char *str = NULL;
/*LOOP THAT USES getc() TO SAVE CHARS INTO THE STRING AND GROWS IT USING realloc() IF NEEDED*/
return str;
}
int main() {
char *str;
str = getStr();
//SOME STUFF HAPPENS HERE WITH THE str. IT REMAINS THE SAME LENGTH.
free(str) //IS THIS THE RIGHT PLACE TO FREE IT?
}
那么,free() 放在正确的位置吗?我明白,由于两个 str 指针都指向同一地址,所以它应该可以工作,对吧?另外,顺便问一下,当 free() 只有第一个地址时,它如何知道在哪里停止释放? 这可能很明显,但我想确定一下。
最佳答案
在您的示例中,这是正确的位置。 当您不再需要数据时,会调用最简单的 free。 根据我的经验,最棘手的部分是当事情没有按计划进行时,或者当您的程序可以通过多种方式退出时。
看看这个完全没有实际用途的虚拟程序。 一个接受整数的程序,如果该整数的值大于 10,则程序将向其添加1。如果没有,它将退出整个程序 exit (1)
static void add_one_to_num(int *num)
{
if (*num < 10)
{
free(num);
exit(1);
}
*num = *num + 1;
}
int main()
{
int *num;
num = malloc(sizeof(int));
printf("Enter a number higher than 10: ");
scanf("%d", num);
add_one_to_num(num);
printf("num: %d\n", *num);
free(num);
return (0);
}
在此程序中,我们可能会在函数 add_one_to_num 处退出,因此您需要在该位置释放该指针。 通过编写越来越多的程序,您将掌握它的窍门,因为它实际上非常合乎逻辑,而且一点也不困惑(对于大型程序来说,在指针传递的所有函数中跟踪所有分配的内存可能是一件痛苦的事情到 )。 只要确保当您不再需要数据或当程序的自然流程发生变化时就可以释放数据。
关于c - 这是释放我在 C 的多个函数中使用的动态字符串的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58684341/