Это правильный способ освободить динамическую строку, которую я использую в нескольких функциях в C? - PullRequest
0 голосов
/ 03 ноября 2019

Я сделал простой базовый конвертер, и первое, что он делает, - получает строку от пользователя. Я хотел, чтобы строка была динамичной, поэтому я сделал это:

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 () знает, где прекратить освобождение, когда он имеет только первый адрес? Это может быть довольно очевидно, но я хочу убедиться.

1 Ответ

0 голосов
/ 04 ноября 2019

В вашем примере это подходящее место для этого. Простейшие бесплатные вызываются, когда вам больше не нужны данные. Сложность в моем опыте - это когда дела идут не так, как запланировано, или когда ваша программа может выйти несколькими способами.

Взгляните на эту фиктивную программу, которая не имеет абсолютно никакой реальной цели. Программа, которая принимает целое число, если это целое число имеет значение больше 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 , поэтому вам нужноосвободить указатель в этом месте. Писая все больше и больше программ, вы поймете это, потому что это на самом деле очень логично и совсем не хаотично (для больших программ может быть боль в шее, чтобы отследить всю выделенную память во всех функциях, переданных указателям)к). Обязательно освобождайте их, когда вам больше не нужны данные или когда что-то меняет естественный поток вашей программы.

...