mempcpy

BSDで新しめの Binutilsをビルドしようとしたら、mempcpyなる関数が
リンクできませんってことで、manで調べてみたら glibcの拡張の関数で、
機能的には memcpyと同じだけど、戻り値が違うというものです。戻り値は
最終的に書き込んだアドレスの次のバイト(正常に書けていれば、
第一引数 dest + 第三引数 nのアドレス)になります。

テスト

#include <stdio.h>
#define _GNU_SOURCE
#include <string.h>

int main (void)
{
     char dest[32];
     void *retval;
     const char src[] = "helloworld";

     retval = mempcpy(dest, src, sizeof(src));
     printf("retval    = %p\n"
            "dest      = %p\n"
            "dest+size = 0x%12lx\n",
            retval, dest, (unsigned long)dest + sizeof(src));

     return 0;
}

結果

期待通りの結果です。

retval    = 0x7fff9e2ef83b
dest      = 0x7fff9e2ef830
dest+size = 0x7fff9e2ef83b

最後に

いまいち使いどころがわからない・・・。