basename
(GNU ではなく) POSIX の関数を使用したい。
マニュアルページから:
dirname() と basename() の両方がパスの内容を変更する可能性があるため、これらの関数のいずれかを呼び出すときにコピーを渡すことが望ましい場合があります。
これらの関数は、後続の呼び出しによって上書きされる可能性がある、静的に割り当てられたメモリへのポインターを返す場合があります。 または、関数によって返されるポインターが不要になるまで、 path によって参照される文字列を変更または解放しないように、path の一部へのポインターを返す場合があります。
また、次のようにも述べています。
戻り
値 dirname() と basename() は両方とも、NULL で終わる文字列へのポインタを返します。(これらのポインターを free (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
) かどうかです。