10

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) かどうかです。

4

1 に答える 1