Nou Generator de prompt AI — scrie prompturi mai bune pentru ChatGPT, Claude și Gemini →

memmove în C

Copiază n octeți ca memcpy, dar funcționează corect și când sursa și destinația se suprapun.

Sintaxă
#include <string.h>
void *memmove(void *dest, const void *src, size_t n);

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(&note[poz], &note[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 + 1 octeț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ă.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: memmove

Ai o nelămurire despre utilizarea comenzii memmove sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.