我想使用POSIX的basename
功能(而不是GNU')。
从手册页:
dirname()和basename()都可以修改path的内容,所以 在调用其中一个函数时,可能需要传递一个副本。
这些函数可能会返回指向静态分配内存的指针,这些内存可能会被后续调用覆盖。的可替换地, 他们可能会返回一个指向路径某些部分的指针,这样路径引用的字符串不应该被修改或释放,直到 不再需要函数返回的指针。
它还说:
返回值
dirname()和basename()都返回指向以null结尾的字符串的指针。 (不要将这些指针传递给免费(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
)手册页说:
使用malloc(3)获取新字符串的内存,可以使用free(3)释放。
所以问题是:我是否应该释放dirc和basec(根据strdup
)或不(根据basename
)?
答案 0 :(得分:4)
dname
和bname
可能分别使用dirc
和basec
的部分内容,因此释放它们并不安全。
我会strdup
和dirname
来自basename
和dirc
来看basec
个结果。然后可以安全地免费dirc
和dname
,并且您知道必须释放副本。
(是的,它很乱,但我认为它比记住你无法释放{{1}}更清晰,因为{{1}}可能会或可能不会使用它......)