c - 这是释放我在 C 的多个函数中使用的动态字符串的正确方法吗?

标签 c string dynamic free

我制作了一个简单的基本转换器,它所做的第一件事就是从用户那里获取一个字符串。我希望字符串是动态的,所以我这样做了:

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/

相关文章:

c++ - 对于已定义的符号,静态库链接问题 "Undefined symbols"

java - 数组如何传递给Java中的函数

python - 去掉string中的一个char,然后用字典做key match

c# - FluentValidation 字符串 NotNull 与 NotEmpty

Python 创建用户输入表单并将输入转换为数据帧

javascript - 有没有办法动态设置 Highchart 选项?

c - 迭代具有非标准字符的 char 数组

string - 如何在JavaCC中使用反斜杠转义字符换行?

java - 动态类加载在运行时失败

c - 库插入/注入(inject)不适用于 open 命令