我想使用POSIX的basename
函數(而不是GNU的)。我應該在C中的basename/dirname之後釋放strdup指針嗎?
從手冊頁:
兩個目錄名稱()和基本名稱()可以修改路徑的內容,所以 可以期望調用這些功能之一時通過一個副本。
這些函數可能會返回指向靜態分配的內存的指針,這些指針可能會被隨後的調用覆蓋。 或者, 它們可能會返回一個指向路徑某些部分的指針,以便路徑引用的字符串不應該被修改或釋放,直到函數返回的 指針不再需要爲止。
它還說:
返回值
兩個目錄名()和基名()的返回指針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
)?
您免費DIRC和BASEC(按的strdup)和你不會釋放dname和bname(根據basename/dirname)。但是你不能釋放dirc,直到你不再需要dname。 – rici 2014-09-30 01:00:42