> > > void copy(char *dst, char *src, size_t n)
> > > {
> > >    size_t l = strlen(src);
> > >    if( l > n-1 )
> > >        l = n-1 ;
> > >    memcpy(dst,src,l);
> > >    dst[l] = 0;
> > > }

> 蛇足ですが,上の例では,文字列のコピーだけ考えるなら
> memcpy(dst,src,n);
> dst[n] = 0;
> で用はなすように思います。dst[l] = 0は保証されているから。

でも,そうすると, memcpy が src の(配列としての)最後を超えて
アクセスすることがあり得ます.その場合,結果は未定義になりますね.