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()
存在的溢出风险==。