这是释放我在 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 处退出,所以您需要在那个地方释放那个指针。 通过编写越来越多的程序,你会掌握它的窍门,因为它实际上非常合乎逻辑而且一点也不混乱(对于大型程序来说,在指针传递的所有函数中跟踪所有分配的内存可能会让人头疼到 )。 当您不再需要数据时,或者当某些事情改变了程序的自然流程时,请确保释放。