我正在尝试使用可能的重叠移动内存,使用* 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); */
答案 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;
}