unsigned char场景下替换memcpy为memcpy_s的参数写法是否正确
问题解答
你给出的memcpy_s调用写法不正确,存在两处会导致功能异常的错误,具体说明如下:
- 第二个参数传
sizeof(dest)是完全错误的取值:dest是unsigned char*类型的指针,sizeof(dest)得到的是指针本身的内存占用长度(32位环境为4字节,64位环境为8字节),和你通过new动态分配的目标缓冲区实际大小没有任何关系。你分配的目标缓冲区总大小为length字节(unsigned char类型单元素大小固定为1字节,new unsigned char[length]分配的总空间就是length字节),这才是第二个参数需要传入的值。 - 第四个参数和源指针存在问题:你写的
length * sizeof (unsigned char)属于冗余计算,C/C++标准明确规定sizeof(unsigned char)的结果恒为1,计算结果和直接传length完全一致;另外你代码里写的源指针a2和前文提到的入参source不一致,属于笔误,需要替换为实际的源缓冲区指针source。
正确调用示例
unsigned char* dest = new unsigned char[length]; // 执行安全内存拷贝 errno_t err = memcpy_s( dest, // 目标缓冲区指针 length, // 目标缓冲区总大小(单位:字节) source, // 源缓冲区指针 length // 待拷贝的字节数 ); // 注意:需要对返回值err做校验,非0值代表拷贝过程出现参数非法等错误,需要做异常处理
补充说明:
memcpy_s的安全机制核心就是靠第二个参数(目标缓冲区总大小)做边界校验,如果待拷贝长度大于目标缓冲区总大小,函数会直接拒绝拷贝并返回错误码,从根源避免缓冲区溢出。如果按照你之前的写法传sizeof(dest),只要length大于指针本身的长度(4/8字节),拷贝就会直接失败,完全无法实现预期的内存复制逻辑。
内容的提问来源于stack exchange,提问作者user2896152
相关产品推荐
相关产品推荐

