web-dev-qa-db-ja.com

strcpy vs strdup

strcpyは文字列をコピーするためのもので、strdupは文字列を複製するために新しい文字列へのポインタを返します。

strcpyを使用したい場合とstrdupを使用したい場合を説明してください。

65
johan

strcpy(ptr2, ptr1)while(*ptr2++ = *ptr1++)と同等です

ここで、strdupは次と同等です

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

memcpyバージョン の方が効率的かもしれません)

したがって、コピーした文字列を別の関数(ヒープセクションで作成される)で使用する場合は、strdupを使用できます。それ以外の場合はstrcpyで十分です。

99
Abdul Muheedh

関数strcpyおよびstrncpyはC標準ライブラリの一部であり、既存のメモリで動作します。つまり、yoは、関数が文字列データをコピーするメモリを提供する必要があり、当然の結果として、yoは、必要なメモリ量を調べる独自の手段を持っている必要があります。

Constrastにより、strdupはPosix関数であり、動的メモリ割り当てを実行します。文字列をコピーした新しく割り当てられたメモリへのポインタを返します。しかしyoはこのメモリを担当し、最終的にはfreeする必要があります。

これにより、strdupは "隠しmalloc"便利関数の1つになります。これが、おそらく標準ライブラリの一部ではない理由です。標準ライブラリを使用している限り、free/mallocごとに1つのcallocを呼び出す必要があることがわかります。ただし、strdupなどの関数は隠しmallocを導入するため、メモリ管理の目的でmallocと同じように扱う必要があります。 (別のそのような隠された割り当て関数はGCCのabi::__cxa_demangle()です。)注意してください!

50
Kerrek SB

strdupはヒープ上の新しい文字列にメモリを割り当てますが、strcpy(またはより安全なstrncpyバリアント)を使用して、事前に割り当てられたメモリに文字列をコピーできますどちらかヒープまたはスタック。

13
Oren

受け入れられた答え では、strdupの実装は次のように表示されます。

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

ただし、strlenstrcpyの両方が、各文字が\0

memcpyを使用する方が効率的です。

char *strdup(const char *src) {
    size_t len = strlen(src) + 1;
    char *s = malloc(len);
    if (s == NULL)
        return NULL;
    return (char *)memcpy(s, src, len);
}
8

char *strdup(char *pszSrch);

strdupは、元の文字列のサイズのストレージを割り当てます。ストレージの割り当てが成功すると、元の文字列が複製文字列にコピーされます。

strdupdは失敗時にNULLを返します。メモリが割り当てられていない場合、コピーは失敗しますstrdup return NULL

0