strcpy
は文字列をコピーするためのもので、strdup
は文字列を複製するために新しい文字列へのポインタを返します。
strcpy
を使用したい場合とstrdup
を使用したい場合を説明してください。
strcpy(ptr2, ptr1)
はwhile(*ptr2++ = *ptr1++)
と同等です
ここで、strdupは次と同等です
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
( memcpyバージョン の方が効率的かもしれません)
したがって、コピーした文字列を別の関数(ヒープセクションで作成される)で使用する場合は、strdupを使用できます。それ以外の場合はstrcpyで十分です。
関数strcpy
およびstrncpy
はC標準ライブラリの一部であり、既存のメモリで動作します。つまり、yoは、関数が文字列データをコピーするメモリを提供する必要があり、当然の結果として、yoは、必要なメモリ量を調べる独自の手段を持っている必要があります。
Constrastにより、strdup
はPosix関数であり、動的メモリ割り当てを実行します。文字列をコピーした新しく割り当てられたメモリへのポインタを返します。しかしyoはこのメモリを担当し、最終的にはfree
する必要があります。
これにより、strdup
は "隠しmalloc
"便利関数の1つになります。これが、おそらく標準ライブラリの一部ではない理由です。標準ライブラリを使用している限り、free
/malloc
ごとに1つのcalloc
を呼び出す必要があることがわかります。ただし、strdup
などの関数は隠しmalloc
を導入するため、メモリ管理の目的でmalloc
と同じように扱う必要があります。 (別のそのような隠された割り当て関数はGCCのabi::__cxa_demangle()
です。)注意してください!
strdup
はヒープ上の新しい文字列にメモリを割り当てますが、strcpy
(またはより安全なstrncpy
バリアント)を使用して、事前に割り当てられたメモリに文字列をコピーできますどちらかヒープまたはスタック。
受け入れられた答え では、strdup
の実装は次のように表示されます。
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
ただし、strlen
とstrcpy
の両方が、各文字が\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);
}
char *strdup(char *pszSrch)
;
strdup
は、元の文字列のサイズのストレージを割り当てます。ストレージの割り当てが成功すると、元の文字列が複製文字列にコピーされます。
strdup
dは失敗時にNULL
を返します。メモリが割り当てられていない場合、コピーは失敗しますstrdup
return NULL
。