Dado un índice y una matriz de enteros, necesito eliminar el elemento en la matriz dada que se almacenó en el índice dado mediante el uso de memcpy() . El nuevo conjunto de elementos se almacenará en la matriz dada.
Aquí hay una ilustración de lo que quiero hacer, aunque tengo problemas para implementarlo.

Entonces arrayElem después de eliminar 10 se vería así:

No puede usar memcpy , porque el origen y el destino se superponen, pero puede usar memmove , por ejemplo:
memmove(&a[1], &a[2], 5 * sizeof(a[0])); Esto copia los 5 elementos que comienzan en a[2] hasta los 5 elementos que comienzan en a[1] , cuidando el hecho de que las regiones de origen y destino se superponen.
No puede usar la función memcpy porque los rangos de la matriz se superponen entre sí. En este caso el comportamiento será indefinido.
En su lugar, debe usar la función estándar memmove .
Aquí hay un programa demostrativo.
#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; }La salida del programa es
1 10 5 8 4 51 2 1 5 8 4 51 2No puede hacer esto usando memcpy() en la misma matriz . Necesitas usar memmove() .
Para citar la página de manual de memcpy()
La función
memcpy()copia n bytes del área de memoriasrcal área de memoriadest. Las áreas de memoria no deben superponerse. Usememmove(3)si las áreas de memoria se superponen.
Ref: memmove()
Sin embargo, si usa una matriz temporal, entonces, en 2 pasos, puede lograr esto usando memcpy() , como
memcpy() la parte requerida de su matriz dada a la matriz temporalmemcpy() devuelve la matriz temporal a la matriz dada a partir del índice requerido.FWIW, ninguno de los enfoques anteriores borrará el valor en el índice 6. El valor existente estará presente. Tienes que hacerlo manualmente.