memcpy与memcpy_s、memmove与memmove_s、sprintf与sprintf_s的区别

1、memcpy与memcpy_s:
两函数原型:

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_s相比memcpy可以有效的检测内存溢出(要复制的字节数超出目标地址可容纳的个数,即size),可以通过返回值校验。但memcpy不保证。memmove与memmove_s、strcpy与strcpy_s与此类似。

参考资料:memcpy与memcpy_s的使用

2、memcpy与memmove与memmove_s:
两函数原型:

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);

两函数目的:s2指向位置的n字节数据拷贝到s1指向的位置。
两函数区别:区别就在于关键字restrict, memcpy假定两块内存区域没有数据重叠,而memmove没有这个前提条件
memmove与相比memcpy可以有效的检测内存区域重叠问题。 memcpy直接复制,不考虑内存区域重叠;memmove会首先检测重叠,再决定复制起始位置。
如果复制的两个区域存在重叠时使用memcpy,其结果是不可预知的(可能成功也可能失败的)所以使用memcpy,程序员自身必须确保两块内存没有重叠部分。

参考资料:memcpy与memmove的区别
腾讯云:memmove_s与memmove

3、sprintf与sprintf_s:
需要包含的头文件:stdio.h
字符串格式化函数,原型:

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);

sprintf_s函数功能是将数据格式化输出到字符串,最后一个参数是变参列表(任意多个任何类型的数据)。sprintf_s()sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险

参考资料:c++中sprintf和sprintf_s的区别
百度百科:sprintf_s

总结:

1、memcpy–>memcpy_s考虑了内存溢出问题;memcpy_s–>memmove_s考虑了内存区域重叠问题,因此使用memmove_s最安全,但相比memcpy_s多了检测是否重叠的开销。
2、字符串格式化函数sprintf_s最后一个参数是变参列表(任意多个任何类型的数据)。sprintf_s()sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险==。

猜你喜欢

转载自blog.csdn.net/qq_33726635/article/details/107453225
今日推荐