删除使用数组中的memcpy

时间:2015-07-09 14:18:44

标签: c arrays memcpy

给定一个索引和一个整数数组,我需要删除给定数组中通过memcpy()存储在给定索引中的元素。新的元素集将存储在给定的数组中。

这是我想要做的事情的一个例子,虽然我在实施它时遇到了麻烦。

enter image description here

删除10后,arrayElem如下所示:

enter image description here

4 个答案:

答案 0 :(得分:4)

您无法使用memcpy,因为来源和目的地重叠,但您可以使用memmove,例如:

memmove(&a[1], &a[2], 5 * sizeof(a[0]));

这会将从a[2]开始的5个元素复制到从a[1]开始的5个元素,并注意源和目标区域重叠的事实。

答案 1 :(得分:1)

您可以使用同一阵列上的memcpy() 来执行此操作。您需要使用memmove()

引用memcpy() man page

  

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%是在没有要求的情况下实际执行此操作的正确方法。