Non devi più cercare altre pagine poiché sei arrivato nello spazio giusto, abbiamo la soluzione che desideri ma senza problemi.
Definito nell'intestazione
|
||
---|---|---|
(1) | ||
void*memcpy(void*dest,constvoid*src,size_t count ); |
(fino al C99) | |
void*memcpy(void*restrict dest,constvoid*restrict src,size_t count ); |
(dal C99) | |
errno_tmemcpy_s(void*restrict dest,rsize_t destsz,constvoid*restrict src,rsize_t count ); |
(2) | (dal C11) |
1) Copie count
dall'oggetto puntato da src
all'oggetto puntato da dest
. Entrambi gli oggetti sono interpretati come array di unsigned char
.
Il comportamento è indefinito se l'accesso avviene oltre la fine dell'array dest. Se gli oggetti si sovrappongono (il che rappresenta una violazione del parametro restrict
contratto)(dal C99) il comportamento è indefinito. Il comportamento è indefinito se dest
o src
è un puntatore nullo.2) Come (1) tranne che per il fatto che i seguenti errori vengono rilevati in fase di esecuzione e causano l'intero intervallo di destinazioni [dest, dest+destsz)
viene azzerato (se entrambi i campi dest
e destsz
sono validi), oltre a richiamare la funzione di gestione dei vincoli attualmente installata:
dest
osrc
è un puntatore nullodestsz
ocount
è maggiore diRSIZE_MAX
count
è maggiore didestsz
(si verificherebbe un overflow del buffer)- gli oggetti di origine e di destinazione si sovrappongono
Il comportamento è indefinito se la dimensione dell'array di caratteri puntato da dest
count
<= destsz
in altre parole, un valore errato di destsz
non rivela l'imminente overflow del buffer. Come per tutte le funzioni con controllo dei limiti, memcpy_s
è garantita solo se __STDC_LIB_EXT1__
è definito dall'implementazione e se l'utente definisce __STDC_WANT_LIB_EXT1__
alla costante intera 1 prima di includere string.h
.
Parametri
destinazione | - | puntatore all'oggetto in cui copiare |
destsz | - | numero massimo di byte da modificare nella destinazione (tipicamente la dimensione dell'oggetto di destinazione) |
src | - | puntatore all'oggetto da cui copiare |
conteggio | - | numero di byte da copiare |
Valore di ritorno
1) Restituisce una copia di dest
2) Restituisce zero in caso di successo e un valore non nullo in caso di errore. Anche in caso di errore, se dest
non è un puntatore nullo e destsz
è valido, scrive destsz
zero byte nell'array di destinazione.
Note
memcpy
può essere utilizzato per impostare il tipo effettivo di un oggetto ottenuto da una funzione di allocazione.
memcpy
è la routine di libreria più veloce per la copia da memoria a memoria. Di solito è più efficiente di strcpy
che deve scansionare i dati che copia o memmove
, che deve prendere precauzioni per gestire la sovrapposizione degli input.
Diversi compilatori C trasformano i loop che copiano la memoria in cicli memcpy
chiamate.
Dove l'aliasing rigoroso proibisce di esaminare la stessa memoria come valori di due tipi diversi, memcpy
può essere utilizzato per convertire i valori.
Esempio
#define__STDC_WANT_LIB_EXT1__1#include#include #include #include #include intmain(void){// simple usagechar source[]="once upon a midnight dreary...", dest[4];memcpy(dest, source,sizeof dest);for(size_t n =0; n <sizeof dest;++n)putchar(dest[n]);// setting effective type of allocated memory to be intint*p =malloc(3*sizeof(int));// allocated memory has no effective typeint arr[3]={1,2,3};memcpy(p,arr,3*sizeof(int));// allocated memory now has an effective type// reinterpreting datadouble d =0.1;// int64_t n = *(int64_t*)(&d); // strict aliasing violationint64_t n;memcpy(&n,&d,sizeof d);// OKprintf("n%a is %" PRIx64 " as an int64_tn", d, n);#ifdef__STDC_LIB_EXT1__set_constraint_handler_s(ignore_handler_s);char src[]="aaaaaaaaaa";char dst[]="xyxyxyxyxy";int r =memcpy_s(dst,sizeof dst,src,5);printf("dst = "%s", r = %dn", dst,r); r =memcpy_s(dst,5,src,10);// count is greater than destsz printf("dst = "");for(size_t ndx=0; ndx<sizeof dst;++ndx){char c = dst[ndx]; c ?printf("%c", c):printf("\0");}printf("", r = %dn", r);#endif}
Possibile uscita:
once 0x1.999999999999ap-4 is 3fb999999999999a as an int64_t dst ="aaaaayxyxy", r =0 dst =" yxyxy", r =22
Riferimenti
- Norma C11 (ISO/IEC 9899:2011):
- 7.24.2.1 La funzione memcpy (p: 362)
- K.3.7.1.1 La funzione memcpy_s (p: 614)
- Standard C99 (ISO/IEC 9899:1999):
- 7.21.2.1 La funzione memcpy (p: 325)
- Standard C89/C90 (ISO/IEC 9899:1990):
- 4.11.2.1 La funzione memcpy
Vedi anche
memmovememmove_s(C11) | sposta un buffer in un altro (funzione) |
wmemcpywmemcpy_s(C95)(C11) | copia una certa quantità di caratteri larghi tra due matrici non sovrapposte (funzione) |
Valuta di consigliare questa notizia se ti è stata utile.