C中的'memdup'功能?

Dan*_*Dan 13 c strdup memcpy

在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
Run Code Online (Sandbox Code Playgroud)

那么,我的问题有三个:

  1. 是否有一些我不知道的标准库函数?
  2. 如果没有,是否有一个简洁的,最好是标准的方法来做到这一点,没有明确的调用mallocmemcpy
  3. 为什么C包括strdup但不包括memdup

小智 16

您可以通过一个简单的功能实现它:

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

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

   return out;
}
Run Code Online (Sandbox Code Playgroud)

  • 这没有回答 3 个具体问题中的任何一个 (2认同)

Mar*_*arc 7

void *xmemdup (void const *p, size_t s)GNU Gnulib 中有xalloc.h.

请注意,它会xalloc_die在内存不足的情况下调用。

  • 这是真正回答任何所问问题的唯一答复。 (2认同)

tva*_*son -7

复制任意内存结构并不像复制字符串那么简单。例如,当结构包含指向其他结构(例如字符串)的指针时,您应该如何处理?“复制”这样的结构意味着什么?与字符串的情况不同,这个问题没有一个正确的答案。在这种情况下,最好让应用程序开发人员创建一种根据其用例制作结构副本的机制,而不是通过假装存在规范的方法来处理问题来混淆问题。

  • 有 memcpy()、memcmp()、memmem()、memchr()。`void * memdup(const void * mem, size_t size)` 有意义吗? (13认同)
  • 除了 memdup 不会是结构的副本。从名字上看,它会复制一个内存区域。这是memdup,而不是datastructedup。 (11认同)
  • @Tim Ring:...同样的问题也适用于简单的分配。低级“memdup”无法正确复制结构的事实不能有意义地用作反对“memdup”的论据。这个答案只是一种煽动性的尝试,试图用不必要的噪音来填补这个问题。 (8认同)
  • 如前所述,与 memcpy() 的工作方式相同。它的目的是复制一个内存区域,该区域碰巧是一个数据结构。 (7认同)
  • @AnT:如果每次我在 StackOverflow 上看到这种尝试都能得到一美元就好了…… (3认同)