给定一个索引和一个整数数组,我需要使用
这是我想要做的事情的说明,但我在实现它时遇到了麻烦。
因此,在删除10后,
memcpy()
删除给定数组中存储在给定索引处的元素。新的一组元素将存储在给定数组中。这是我想要做的事情的说明,但我在实现它时遇到了麻烦。
因此,在删除10后,
arrayElem
看起来像这样:memcpy()
是不难实现的。请查看下面的答案。 - Sourav Ghoshmemmove
的作用,并查看@Vlad的答案,因为他解释了为什么在数组末尾会出现重复元素。请注意,不存在“空”数组元素-任何未使用的元素中都将始终存在某些值。 - Paul R如果数组的范围重叠,您可能无法使用函数 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
memcpy
,那么您可以逐个复制字节直到数组结束,以防止源和目标重叠。在这种情况下,memcpy
代替了单个内存分配,并且极其低效,但它会实现您想要的功能。for(int i=1; i<=5; i++)
{
memcpy(arrayElem[i], arrayElem[i+1], sizeof(*arrayElem));
}
虽然有点不好看,但是这个做法符合任务中规定的法律要求。然而,使用memmove
是百分之百正确的方法,而且没有这个要求也可以这样做。
memcpy()
在同一数组上进行操作,需要使用 memmove()
。引用 memcpy()
man page 的话来说:
参考:
memcpy()
函数将 n 个字节从内存区域src
复制到内存区域dest
。内存区域不得重叠。如果内存区域重叠,请使用memmove(3)
。
memmove()
但是,如果您使用临时数组,则可以通过 2 步使用 memcpy()
实现此目的,如下所示:
memcpy()
您给定的数组的所需部分到临时数组memcpy()
值得一提的是,以上两种方法都无法“清除”索引为6的值。现有的值仍将存在。您需要手动完成此操作。
memmove
函数。它是memcpy
函数的“安全”版本,允许处理重叠的内存区域。 - Eugene Sh.