用VS2005编写程序的时候,为避免出现内存拷贝溢出,每次都使用带长度检测的函数,可是一直都没有去对每一个函数的使用进行过测试,当向团队其他同事介绍使用这些函数的好处时就不能有实际的例子可以给出,所以抽个时间测试了一下,列出如下:
memcpy_s : 目标内存必须大于等于源内存
strcpy_s: 拷贝源字符串到目标,当源字符串长度大于等于目标字符串内存时,断言异常
strncpy_s:拷贝源字符串到目标,验证目标字符串buffer是否足够,不足够断言异常。拷贝的最大长度根据实际源字符串长度和指定铐贝的长度确定,取最小长度。
sprintf: 格式化字符串,不进行超界检查
sprintf_s: 输出buffer长度不够,断言
例子:
char ar1[10] = {0};
char ar2[20] = {0};
memcpy_s(ar1, 10, ar2, 10);
memcpy_s(ar1, 10, ar2, 20); // 异常
strcpy_s(ar1, 10, ar2);
const char* pStr = "abcdefghij"; // 10字符
strcpy_s(ar1, 10, pStr); // 异常
strcpy(ar1, pStr); // 拷贝10个字符,释放内存异常,源字符串大于目标字符buffer,溢出但不报错
const char* pStr1 = "this";
errno_t err = strncpy_s(ar1, 10, pStr1, 10);
const char* pStr2 = "this is test strncpy_s.";
err = strncpy_s(ar1, 10, pStr2, 9);
err = strncpy_s(ar1, 10, pStr2, 10); // 异常