是否可以有效替换memmove()函数?

时间:2011-10-11 03:51:10

标签: c

我正在尝试使用可能的重叠移动内存,使用* src和* dst的负增量或正增量,而不使用大的临时缓冲区。

我正在努力为memmove()函数找到一个有效的替代品,类似于:

smart_memmove(char *dst, const char *src, size_t num, int dst_inc, int src_inc);

dst和src可能重叠,dst_inc和src_inc可以是任何正整数或负整数(负增量表示在内存中向后移动,起始指针位于顶部)。我想避免使用大型临时缓冲区,即使它意味着降低执行速度。

这样做的一个例子是从内存位置0开始复制10个字节,每隔一个字节递增一次,到向后计数1的内存位置17:

smart_memmove(17, 0, 10, -1, 2);

另一个例子是,通过使用以下参数调用smart_memmove,在内存位置6,9,12,15,18,21,24,27,30,33中反转10个字节系列:

smart_memmove(6, 33, 10, 3, -3); /* or... smart_memmove(33, 6, 10, -3, 3); */

1 个答案:

答案 0 :(得分:-1)

您还可以选择memcpy()函数。

void * memcpy ( void * destination, const void * source, size_t num );

destination 指向要复制内容的目标数组的指针,类型转换为void *类型的指针。

source 指向要复制的数据源的指针,类型转换为const void *。

类型的指针

num 要复制的字节数。

size_t是无符号整数类型。

将num指向的位置的num个字节值直接复制到目标指向的内存块。

源指针和目标指针指向的对象的基础类型与此函数无关;结果是数据的二进制副本。

该函数不检查源中的任何终止空字符 - 它总是复制num字节。

为避免溢出,目标和源参数指向的数组大小应至少为num个字节,并且不应重叠(对于重叠的内存块,memmove是一种更安全的方法)。

示例程序

/* memcpy example */
#include <stdio.h>
#include <string.h>

struct {
  char name[40];
  int age;
} person, person_copy;

int main ()
{
  char myname[] = "user613994";

  /* using memcpy to copy string: */
  memcpy ( person.name, myname, strlen(myname)+1 );
  person.age = 46;

  /* using memcpy to copy structure: */
  memcpy ( &person_copy, &person, sizeof(person) );

  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );

  return 0;
}