这是释放我在 C 的多个函数中使用的动态字符串的正确方法吗?
Is this the right way to free a dynamic string I'm using in multiple functions in C?
我做了一个简单的基本转换器,它做的第一件事就是从用户那里获取一个字符串。我希望字符串是动态的,所以我这样做了:
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() 只有第一个地址时,它如何知道在哪里停止释放?
这可能很明显,但我想确定一下。
在您的示例中,这是正确的位置。
当您不再需要数据时,将调用最简单的免费方法。
根据我的经验,棘手的部分是当事情没有按计划进行时,或者当您的程序可以通过多种方式退出时。
看看这个完全没有实际用途的虚拟程序。
一个接受整数的程序,如果这个整数的值大于 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 处退出,所以您需要在那个地方释放那个指针。
通过编写越来越多的程序,你会掌握它的窍门,因为它实际上非常合乎逻辑而且一点也不混乱(对于大型程序来说,在指针传递的所有函数中跟踪所有分配的内存可能会让人头疼到 )。
当您不再需要数据时,或者当某些事情改变了程序的自然流程时,请确保释放。
我做了一个简单的基本转换器,它做的第一件事就是从用户那里获取一个字符串。我希望字符串是动态的,所以我这样做了:
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() 只有第一个地址时,它如何知道在哪里停止释放? 这可能很明显,但我想确定一下。
在您的示例中,这是正确的位置。 当您不再需要数据时,将调用最简单的免费方法。 根据我的经验,棘手的部分是当事情没有按计划进行时,或者当您的程序可以通过多种方式退出时。
看看这个完全没有实际用途的虚拟程序。 一个接受整数的程序,如果这个整数的值大于 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 处退出,所以您需要在那个地方释放那个指针。 通过编写越来越多的程序,你会掌握它的窍门,因为它实际上非常合乎逻辑而且一点也不混乱(对于大型程序来说,在指针传递的所有函数中跟踪所有分配的内存可能会让人头疼到 )。 当您不再需要数据时,或者当某些事情改变了程序的自然流程时,请确保释放。