Я хочу использовать функцию POSIX basename
(в отличие от GNU).Должен ли я освобождать указатель strdup после basename/dirname в C?
От человека страницы:
Оба имя_директории() и базового() может изменить содержимое пути, так может быть желательно, чтобы передать копию при вызове одной из этих функций.
Эти функции могут возвращать указатели в статически выделенную память, которые могут быть перезаписаны последующими вызовами. В качестве альтернативы, они могут возвращать указатель на некоторую часть пути, так что строка, указанная по пути, не должна изменяться или освобождаться до тех пор, пока указатель , возвращаемый функцией, больше не требуется.
Он также говорит:
ВОЗВРАТ СТОИМОСТЬ
Оба имя_директории() и() базовый возвращают указатели на нуль-терминатор строки. (Не пропустите эти указатели, чтобы освободить (3).)
Так пример показывает, что-то вроде:
Пример
char *dirc, *basec, *bname, *dname; char *path = "/etc/passwd"; dirc = strdup(path); basec = strdup(path); dname = dirname(dirc); bname = basename(basec); printf("dirname=%s, basename=%s\n", dname, bname);
strdup
(strndup
) man page говорит:
Память для новой строки получена с помощью malloc (3) и может быть освобождена со свободным (3).
Так что вопрос: Должен ли я свободно DIRC и BASEC (в соответствии с strdup
) или нет (как в basename
)?
Вы бесплатно DIRC и BASEC (согласно strdup) и вы не освобождаете dname и bname (в соответствии с basename/dirname). Но вы не можете освободить dirc, пока вам больше не понадобится dname. – rici