7

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

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

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

4

2 回答 2

12

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

不,在一般情况下是不可能的。只有当数组中元素的类型是普通布局时,您才能这样做。

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

ints 是微不足道的类型,因此对于这种特殊情况,它会起作用:

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

于 2013-02-07T17:32:06.097 回答
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));

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

于 2013-02-07T17:37:28.287 回答