Ce face memmove
memmove se comportă ca și cum octeții ar fi copiați întâi într-o zonă temporară și apoi la destinație. De aceea poți muta elemente în interiorul aceluiași tablou, spre stânga sau spre dreapta.
Cazul tipic: ștergerea sau inserarea unui element într-un tablou. Elementele de după poziție se mută cu un loc, iar zona sursă și zona destinație se suprapun.
Dacă știi sigur că zonele nu se suprapun, memcpy este suficient; dacă nu ești sigur, folosește memmove.
Parametri
| Parametru | Descriere |
|---|---|
dest |
Unde ajung octeții. |
src |
De unde se copiază; poate să se suprapună cu dest. |
n |
Câți octeți se mută. |
Ce returnează
Pointerul dest.
Exemple
Exemplul 1: Ștergerea unui element din tablou
Ștergem elementul de pe poziția 1 mutând cele 3 elemente de după el cu un loc la stânga.
#include <stdio.h>
#include <string.h>
int main(void) {
int note[5] = {9, 4, 10, 8, 7};
size_t n = 5, poz = 1;
memmove(¬e[poz], ¬e[poz + 1], (n - poz - 1) * sizeof note[0]);
n--;
for (size_t i = 0; i < n; i++) {
printf("%d ", note[i]);
}
printf("\n");
return 0;
}
Rezultat
9 10 8 7
Exemplul 2: Inserarea unui caracter într-un șir
Mutăm restul șirului (inclusiv terminatorul) cu un loc la dreapta, apoi scriem caracterul nou.
#include <stdio.h>
#include <string.h>
int main(void) {
char cod[16] = "RO12";
size_t poz = 2;
memmove(&cod[poz + 1], &cod[poz], strlen(cod) - poz + 1);
cod[poz] = '-';
printf("%s\n", cod);
return 0;
}
Rezultat
RO-12
Greșeli frecvente
- Uiți să muți și terminatorul când lucrezi cu șiruri: numără
strlen(s) - poz + 1octeți. - Muți elementele spre dreapta într-un tablou plin: ultimul element iese din tablou. Verifică întâi că ai loc.
Comenzi înrudite
memcpy: Copiază n octeți dintr-o zonă de memorie în alta; zonele nu au voie să se suprapună.memset: Umple primii n octeți ai unei zone de memorie cu aceeași valoare, de obicei 0.Tablouri (array): Un șir de elemente de același tip, așezate unul după altul în memorie și accesate prin index, de la 0.realloc: Schimbă dimensiunea unui bloc alocat dinamic, păstrând conținutul; poate muta blocul la altă adresă.
Întrebări & Exemple de Cod:
memmoveAi o nelămurire despre utilizarea comenzii
memmovesau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.