给定一个索引和一个整数数组,我需要删除给定数组中通过memcpy()
存储在给定索引中的元素。新的元素集将存储在给定的数组中。
这是我想要做的事情的一个例子,虽然我在实施它时遇到了麻烦。
删除10后,arrayElem
如下所示:
答案 0 :(得分:4)
您无法使用memcpy,因为来源和目的地重叠,但您可以使用memmove,例如:
memmove(&a[1], &a[2], 5 * sizeof(a[0]));
这会将从a[2]
开始的5个元素复制到从a[1]
开始的5个元素,并注意源和目标区域重叠的事实。
答案 1 :(得分:1)
您可以使用同一阵列上的memcpy()
来执行此操作。您需要使用memmove()
。
memcpy()
函数将n个字节从内存区域src
复制到内存区域dest
。内存区域不得重叠。如果内存区域重叠,请使用memmove(3)
。
参考:memmove()
但是,如果您使用临时数组,则可以分两步使用memcpy()
实现此目的,例如
memcpy()
您给定数组的必需部分到临时数组memcpy()
将临时数组从所需索引开始返回给定数组。FWIW,上述方法都不会清除索引6中的值。现有值将存在。你需要手动完成。
答案 2 :(得分:1)
您可能不使用函数memcpy
,因为数组的范围相互重叠。在这种情况下,行为将是未定义的。
相反,您必须使用标准函数memmove
。
这是一个示范程序
#include <stdio.h>
#include <string.h>
size_t remove_by_index( int a[], size_t n, size_t i )
{
if ( i < n )
{
memmove( a + i, a + i + 1, ( n - i - 1 ) * sizeof( *a ) );
--n;
}
return n;
}
int main( void )
{
int a[] = { 1, 10, 5, 8, 4, 51, 2 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t n = N;
for ( size_t i = 0; i < n; i++ ) printf( "%d ", a[i] );
printf( "\n" );
n = remove_by_index( a, n, 1 );
for ( size_t i = 0; i < n; i++ ) printf( "%d ", a[i] );
printf( "\n" );
return 0;
}
程序输出
1 10 5 8 4 51 2
1 5 8 4 51 2
答案 3 :(得分:1)
如果你&#34;必须&#34;使用memcpy
,然后您可以在阵列上一次复制1个字节,以防止源和目标重叠。在这种情况下,memcpy代表单个内存分配并且效率极低,但它会做你想要的。
for(int i=1; i<=5; i++)
{
memcpy(arrayElem[i], arrayElem[i+1], sizeof(*arrayElem));
}
Icky,但是遵循作业中规定的法律条文。 memmove
虽然100%是在没有要求的情况下实际执行此操作的正确方法。