7

strlcpy.cが引数をローカル変数にコピーする理由は何ですか?

size_t
strlcpy(char *dst, const char *src, size_t siz)
{
    char *d = dst;
    const char *s = src;
    size_t n = siz;

    /* Copy as many bytes as will fit */
    if (n != 0) {
        while (--n != 0) {
            if ((*d++ = *s++) == '\0')
                break;
        }
    }

    /* Not enough room in dst, add NUL and traverse rest of src */
    if (n == 0) {
        if (siz != 0)
            *d = '\0';      /* NUL-terminate dst */
        while (*s++)
            ;
    }

    return(s - src - 1);    /* count does not include NUL */
}

アップデート

ボディを追加しました。

4

5 に答える 5

5

非常に一般的な理由の1つは、変数が関数で変更され、引数とともに式で使用されることです。

たとえば、関数は変数nを変更し、後で変更する場合がありますreturn siz - n;

于 2013-01-25T10:10:40.857 に答える
1

実際、残りのコードでは、いくつかのものを計算するためにsizとsrcが必要です。

/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0) {
    if (siz != 0)
        *d = '\0';      /* NUL-terminate dst */
    while (*s++)
        ;
}

return(s - src - 1);    /* count does not include NUL */

しかし、dstがローカルにコピーされる理由がわかりません。たぶん対称性のためだけに。

于 2013-01-25T10:12:45.797 に答える
1

少なくともsrc引数については、返される長さを計算するために使用されます。その関数の最後の行は、次のことを示しています。

return(s - src - 1);

議論に関してはdst、それは実際には必要ではありませんが、一貫性を保つために行われた可能性があります。まともな最適化コンパイラは、この一見余分な変数の影響を受けない可能性があるため、おそらく問題ではありません。

于 2013-01-25T10:13:03.383 に答える
1

dstd、私は、ただ単純化のためだと思います。他の変数については、初期値と更新された値の両方で「コード」で使用されます。

于 2013-01-25T10:13:24.983 に答える
0
size_t
strlcpy(char *dst, const char *src, size_t siz)
{                     ^-------------------------->constant so must not be modified. that's why a temp variable is needed for modification.     
    char *d = dst;     <-- useless may be.
    const char *s = src;
    size_t n = siz;      

    /* Copy as many bytes as will fit */
    if (n != 0) {        
        while (--n != 0) {
            if ((*d++ = *s++) == '\0')
                break;
        }
    }

    /* Not enough room in dst, add NUL and traverse rest of src */
    if (n == 0) {                    <-- new n arg.
        if (siz != 0)              <---  original siz arg
            *d = '\0';      /* NUL-terminate dst */
        while (*s++)
            ;
    }

    return(s - src - 1);    /* count does not include NUL */  <-- using the original and modified values of s and src together.
}
于 2013-01-25T10:17:59.320 に答える