strdup()
次のように、C 文字列のコピーを返すために使用できます。
#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
stringB = strdup(stringA);
/* ... */
free(stringB);
を使用することもできますstrcpy()
が、最初にスペースを割り当てる必要があります。これは難しくありませんが、正しく行わないとオーバーフロー エラーが発生する可能性があります。
#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
/* you must add one to cover the byte needed for the terminating null character */
stringB = (char *) malloc( strlen(stringA) + 1 );
strcpy( stringB, stringA );
/* ... */
free(stringB);
を使用できない場合は、代わりに をstrdup()
使用することをお勧めします。この関数は最大 — 最大 —バイトまでしかコピーしないため、オーバーフロー エラーを回避できます。ただし、自分で終了する必要がある場合。しかし、一般的に、必要なサイズは次のようにわかります。strncpy()
strcpy()
strncpy()
n
strlen(stringA) + 1 > n
stringB
#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
/* you must add one to cover the byte needed for the terminating null character */
stringB = (char *) malloc( strlen(stringA) + 1 );
strncpy( stringB, stringA, strlen(stringA) + 1 );
/* ... */
free(stringB);
私strdup()
自身はよりクリーンだと思うので、文字列のみを扱う場合に使用しようとしています。パフォーマンスに関して、POSIX/非 POSIX アプローチに重大な欠点があるかどうかはわかりませんが、私は C または C++ の専門家ではありません。
malloc()
toの結果をキャストすることに注意してくださいchar *
。これは、あなたの質問が質問としてタグ付けされているためc++
です。C++ では、 からの結果をキャストする必要がありmalloc()
ます。ただし、C ではこれをキャストしません。
編集
複雑な問題が 1 つありますstrdup()
。C または C++ にはありません。したがって、strcpy()
orstrncp()
を事前にサイズ指定された配列またはmalloc
-ed ポインターと共に使用します。のstrncp()
代わりにstrcpy()
、その関数を使用する場所で使用することをお勧めします。エラーの可能性を減らすのに役立ちます。