La diferencia entre memcpy y memcpy_s, memmove y memmove_s, sprintf y sprintf_s

1. memcpy y memcpy_s:
dos prototipos de funciones:

void* memcpy(
	void *restrict s1, 
	const void *restrict s2, 
	size_t n);
	
errno_t memcpy_s(
	void *dest, // dest:目标的地址
	size_t numberOfElements, // numberOfElements:目标的size
	const void *src, // src:源地址
	size_t count); // count:要拷贝的字节数

memcpy_sEn comparación con la memcpydetección efectiva de desbordamiento de memoria (el número de bytes que se copiarán excede el número que puede contener la dirección de destino, es decir, el tamaño), se puede verificar mediante el valor de retorno. Pero memcpy no garantiza.memmove y memmove_s, strcpy y strcpy_s son similares.

Materiales de referencia: el uso de memcpy y memcpy_s

2. memcpy y memmove y memmove_s:
dos prototipos de funciones:

void *memcpy(void *restrict s1, const void *restrict s2, size_t n);
void *memmove(void *s1, const void *s2, size_t n);
errno_t memmove_s(void * dest,rsize_t destsz,const void * src,rsize_t count);

Objetivo dos funciones: la s2ubicación apuntada a los ndatos de bytes copiados a la s1ubicación apuntada.
La diferencia entre las dos funciones:La diferencia radica en la palabra clave restrict, memcpy asume que no hay superposición de datos entre las dos áreas de memoria y memmove no tiene esta condición previa.
memmove与Por el contrario, memcpypuede detectar eficazmente el problema de superposición del área de memoria.Memcpy copia directamente, independientemente de la superposición del área de memoria; memmove primero detectará la superposición y luego determinará la posición de inicio de la copia.
Si usa memcpy cuando hay superposición entre las dos áreas copiadas, el resultado es impredecible (puede tener éxito o fallar) Por lo tanto, para usar memcpy, el programador debe asegurarse de que las dos piezas de memoria no se superpongan.

Referencias: la diferencia entre memcpy y memmove
Tencent Cloud: memmove_s y memmove

3. sprintf y sprintf_s:
archivos de encabezado que deben incluirse:
función de formato de cadena stdio.h , prototipo:

int sprintf_s(
	char *buffer, // char型指针,指向将要写入字符串的缓冲区。
	size_t sizeOfBuffer,
	const char *format, // format:格式化字符串
	[argument...] // va_list,变参列表(任意多个任何类型的数据)
);

char buffer[200]; // 需要预先分配缓冲区
sprintf_s( buffer, sizeof(buffer), "Output:%s character count = %d\n", var1, var2);
sprintf_s(buffer, sizeof(buffer), "%s %s %s %s",path1,filepath,path3,path4);

La función de sprintf_s es formatear los datos y enviarlos a una cadena.El último parámetro es una lista de parámetros variables (cualquier número de datos de cualquier tipo). sprintf_s()sprintf(), la versión segura, evita sprintf()el riesgo de desbordamiento especificando la longitud del búfer

Referencia: La diferencia entre sprintf y sprintf_s en c ++
Baidu Encyclopedia: sprintf_s

para resumir:

1. memcpy–> memcpy_s considera el problema de desbordamiento de memoria, memcpy_s–> memmove_s considera el problema de superposición del área de memoria, por lo que usar memmove_s es lo más seguro, pero en comparación con memcpy_s, tiene más sobrecarga para detectar si hay superposición.
2. El último parámetro de la función de formato de cadena sprintf_s es una lista de parámetros variables (cualquier número de datos de cualquier tipo). sprintf_s()sprintf(), la versión de seguridad, especificando la longitud del búfer para evitar sprintf()el riesgo de desbordamiento ==.

Supongo que te gusta

Origin blog.csdn.net/qq_33726635/article/details/107453225
Recomendado
Clasificación