not memcpy_s declared c++ memcpy

c++ - memcpy_s - memmove



c++ memcpy devuelve valor (5)

Al devolver un valor, se puede usar una invocación de la función memcpy como valor r.

de acuerdo con http://en.cppreference.com/w/cpp/string/byte/memcpy El memcpy c ++ toma tres parámetros: destino, fuente y tamaño / bytes. también devuelve un puntero. ¿por qué es así? no son los parámetros suficientes para introducir y copiar datos.

o estoy malinterpretando algo? los ejemplos no usan el valor de retorno


IIRC, en las primeras versiones de C no hubo retorno void . Por lo tanto, las funciones de la biblioteca que han existido durante un tiempo suficiente devuelven algo por razones heredadas, y esto fue lo mejor que pudieron encontrar.

Hay una serie de funciones en string.h que devuelven el parámetro de destino: memcpy , strcpy , strcat . No es muy útil, pero no hace daño (probablemente en muchas convenciones de llamadas ni siquiera se requiere una instrucción para implementar).

Podría concebir un uso: char *nextbuf = memcpy(get_next_buf(), previous_buf+offset, previous_size-offset); en lugar de char *nextbuf = get_next_buf(); memcpy(nextbuf, etc); char *nextbuf = get_next_buf(); memcpy(nextbuf, etc); O algo.

Para la comparación, qsort devuelve void. Podría haber sido definido para devolver la base en el principio de "devolver algo, podría ser útil", pero no lo fue. std::copy manera más útil devuelve un iterador al final del rango de salida. Para los iteradores de acceso no aleatorio que pueden no ser triviales, o incluso posibles, para que la persona que llama los calcule.


Puede convertir el retorno en un vacío si desea indicar que no lo está utilizando, por ejemplo:
(void) memcpy(mydest, mysrc, mybytes);


Si una función no tiene nada específico para devolver, a menudo es habitual devolver uno de los parámetros de entrada (el que se ve como el principal ). Hacer esto le permite usar llamadas de función "encadenadas" en expresiones. Por ejemplo, puedes hacer

char buffer[1024]; strcat(strcpy(buffer, "Hello"), " World");

específicamente porque strcpy devuelve el valor dst original como su resultado. Básicamente, al diseñar una función de este tipo, es posible que desee elegir el parámetro más apropiado para "encadenar" y devolverlo como resultado (nuevamente, si tiene otra cosa que devolver, es decir, si de lo contrario su función se devolverá void ).

A algunas personas les gusta, otras no. Es una cuestión de preferencia personal. La biblioteca estándar de C a menudo admite esta técnica, siendo memcpy otro ejemplo. Un posible caso de uso podría ser algo en la línea de

char *clone_buffer(const char *buffer, size_t size) { return memcpy(new char[size], buffer, size); }

Si memcpy no devolvió el puntero del búfer de destino, probablemente tendríamos que implementar lo anterior como

char *clone_buffer(const char *buffer, size_t size) { char *clone = new char[size]; memcpy(clone, buffer, size); return clone; }

que se ve "más largo". No hay razón para ninguna diferencia en la eficiencia entre estas dos implementaciones. Y es discutible qué versión es más legible. Aun así, muchas personas pueden apreciar la oportunidad "gratuita" de escribir frases tan concisas como la primera versión anterior.

Muy a menudo la gente encuentra confuso que memcpy devuelva el puntero del búfer de destino, porque existe la creencia popular de que devolver un puntero desde una función debería indicar (o siempre) que la función podría asignar / reasignar memoria. Si bien esto podría indicar lo último, no existe una regla tan dura y nunca ha habido, por lo que la opinión a menudo expresada de que devolver un puntero (como hace memcpy ) es de alguna manera "incorrecta" o "mala práctica" es totalmente infundada.


void* memcpy( void* dest, const void* src, std::size_t count ); returns void * which can be assigned to another void array that can be used as int or char data type. void * ret = new int[6]; ret = memcpy(newarr,arr,sizeof(int)* 5);