14

Cでは、を使用strdupしてバッファを簡潔に割り当て、そこに文字列をコピーできます。しかし、私が知る限り、一般的な記憶には同様の機能はありません。たとえば、私は言うことはできません

struct myStruct *foo = malloc(sizeof(struct myStruct));
fill_myStruct(foo);

struct myStruct *bar = memdup(foo, sizeof(struct myStruct));
// bar is now a reference to a new, appropriately sized block of memory,
//   the contents of which are the same as the contents of foo

したがって、私の質問は3つあります。

  1. 私が知らないこのような標準ライブラリ関数はありますか?
  2. そうでない場合は、とを明示的に呼び出さずにこれを行うための簡潔で、できれば標準的な方法はmallocありmemcpyますか?
  3. なぜCには含まれているのに含まれstrdupていないmemdupのですか?
4

5 に答える 5

18

簡単な関数で実装できます。

void* memdup(const void* mem, size_t size) { 
   void* out = malloc(size);

   if(out != NULL)
       memcpy(out, mem, size);

   return out;
}
于 2015-03-13T14:52:56.687 に答える
6

void *xmemdup (void const *p, size_t s)GNUGnulibにありxalloc.hます。

xalloc_dieメモリが不足している場合に呼び出すことに注意してください。

于 2019-08-13T08:08:20.710 に答える
0

memdup()おそらく、自分自身を定義して、すでに提案されているようにコードでそれを使用したいだけでしょう。私のバージョンの関数は次のとおりです。

void *memdup(const void *src, size_t n)
{
    void *dest;

    dest = malloc(n);
    if (dest == NULL)
            return NULL;

    return memcpy(dest, src, n);
}

些細なことなのか、冗長なことなのかという議論についてmemdup()は、そうは思いません。コード内の構造をコピーするのにとても便利です。C標準ライブラリのANSI/ISOおよびPOSIX標準には、非常に多くの便利な関数が含まれていますが、残念ながらこれは含まれていません。

例:をstrdup()使用した再実装memdup()

char *strdup(const char *src)
{
    return memdup(src, strlen(src) + 1);
}

例:memdup()オブジェクトを複製するために使用します。

int some_function(const struct some_struct *some_const_data)
{
    struct some_struct *my_mutable_copy;

    my_mutable_copy = memdup(some_const_data, sizeof *some_const_data);
    if (my_mutable_copy == NULL)
        return -1;

    ...

    return 0;
}
于 2018-01-16T12:41:49.960 に答える
-2

strdup関数は、nullで終了する文字列を読み取り、nullまでコピーします。ただし、通常のデータにはそのような区切り文字がないため、コピーするデータの長さを指定する必要があります。

于 2012-12-01T20:59:23.457 に答える
-6

任意のメモリ構造のコピーを作成することは、文字列をコピーすることほど簡単ではありません。たとえば、構造体に他の構造体(文字列など)へのポインタが含まれている場合は、どのように処理する必要がありますか?そのような構造を「複製」するとはどういう意味ですか?文字列の場合とは異なり、これに対する正しい答えは1つではありません。その場合、正規の処理方法があると偽って問題を混乱させるのではなく、アプリケーション開発者にユースケースに従って構造のコピーを作成するメカニズムを作成させる方がおそらく良いでしょう。

于 2012-12-01T20:58:46.557 に答える