使用memcpy复制数组的一部分,以及其他内存操作工具

时间:2013-02-07 17:29:18

标签: c++ arrays memcpy

是否可以使用memcpy复制数组的一部分?

比如说我们有一个10个整数的数组。我们可以创建一个新数组,并将最后5个整数复制到其中吗?

是否有其他可用于c / c ++的内存/阵列复制/操作工具?

2 个答案:

答案 0 :(得分:9)

  

是否可以使用memcpy复制数组的一部分?

不,在一般情况下是不可能的。只有当数组中元素的类型为琐碎布局时,才能执行此操作。

  

比如说我们有一个10个整数的数组。我们可以创建一个新数组,并将最后5个整数复制到其中吗?

int琐碎的类型,因此对于特定情况,它会起作用:

int source[10] = { ::: };
int target[5];

std::memcpy( target, source + 5, 5 * sizeof(int) );
  

是否有其他可用于c / c ++的内存/阵列复制/操作工具?

当然, C ++标准库中的整套算法都适用于数组。您可以使用指向数组中第一个和最后一个元素的指针作为begin/end迭代器。或者,如果您使用的是 C ++ 11 ,那么只需std::begin|end( array )

std::copy( source + 5, source + 10, target + 0 );

std::copy( std::begin(source) + 5, std::end(source), std::begin(target) );

以下是一个元函数,可用于检查类型是否为琐事,以及此类概念的定义:http://en.cppreference.com/w/cpp/types/is_trivial

答案 1 :(得分:1)

memmove()就是为了这个目的。

编辑:memcpy()工作得很好。无论如何,它可能更精简。

在这个例子中,代码是这样的:

int array1[10] = {0,1,2,3,4,5,6,7,8,9};
int array2[5] = {0,0,0,0,0};

memmove(array2, array1 + 5 * sizeof(int), 5 * sizeof(int));

这会将5批int从array1(位置5)复制到array2,位置0。