c memcpy strcpy

memcpy c++



strcpy vs. memcpy (8)

¿Qué se podría hacer para ver este efecto?

Compila y ejecuta este código:

void dump5(char *str); int main() { char s[5]={''s'',''a'',''/0'',''c'',''h''}; char membuff[5]; char strbuff[5]; memset(membuff, 0, 5); // init both buffers to nulls memset(strbuff, 0, 5); strcpy(strbuff,s); memcpy(membuff,s,5); dump5(membuff); // show what happened dump5(strbuff); return 0; } void dump5(char *str) { char *p = str; for (int n = 0; n < 5; ++n) { printf("%2.2x ", *p); ++p; } printf("/t"); p = str; for (int n = 0; n < 5; ++n) { printf("%c", *p ? *p : '' ''); ++p; } printf("/n", str); }

Producirá esta salida:

73 61 00 63 68 sa ch 73 61 00 00 00 sa

Puedes ver que el "ch" fue copiado por memcpy() , pero no por strcpy() .

¿Cuál es la diferencia entre memcpy () y strcpy ()? Intenté encontrarlo con la ayuda de un programa, pero ambos dan el mismo resultado.

int main() { char s[5]={''s'',''a'',''/0'',''c'',''h''}; char p[5]; char t[5]; strcpy(p,s); memcpy(t,s,5); printf("sachin p is [%s], t is [%s]",p,t); return 0; }

Salida

sachin p is [sa], t is [sa]


Debido al carácter nulo en su cadena s, el printf no mostrará nada más allá de eso. La diferencia entre p y t estará en los caracteres 4 y 5. p no tendrá ninguno (será basura) y t tendrá la ''c'' y la ''h''.


El problema con su programa de prueba es que el printf() deja de insertar el argumento en %s , cuando encuentra una terminación nula /0 . Entonces, en su salida, probablemente no se haya dado cuenta, que memcpy() copió los caracteres c y h .

He visto en GNU glibc-2.24 , que (para x86) strcpy() simplemente llama memcpy(dest, src, strlen(src) + 1) .


La principal diferencia es que memcpy () siempre copia el número exacto de bytes que especifique; strcpy (), por otro lado, copiará hasta que lea un byte NUL (también conocido como 0), y luego se detendrá después de eso.


strcpy copia el carácter del origen al destino uno por uno hasta que encuentra el carácter NULL o ''/ 0'' en el origen.

while((*dst++) = (*src++));

donde a medida que memcpy copia datos (no caracteres) del origen al destino de un tamaño dado n, independientemente de los datos en el origen.

memcpy debe usar memcpy si sabe bien que la fuente contiene otro carácter distinto del carácter. para datos encriptados o datos binarios, memcpy es la manera ideal de hacerlo.

strcpy está en desuso, así que usa strncpy .


strcpy detiene cuando encuentra un valor NULL, memcpy no. No ve el efecto aquí, ya que %s en printf también se detiene en NULL.


strcpy termina cuando se encuentra el terminador nulo de la cadena fuente. memcpy requiere que se memcpy un parámetro de tamaño. En el caso de que haya presentado, la instrucción printf se detiene después de que se encuentra el terminador nulo para ambas matrices de caracteres, sin embargo, encontrará que t[3] t[4] han copiado datos en ellas.


  • Diferencia de comportamiento: strcpy detiene cuando encuentra un NULL o ''/0''
  • Diferencia de rendimiento: memcpy suele ser más eficiente que strcpy , que siempre escanea los datos que copia