memcpy行为不符合预期:复制2字节char数组后输出异常求助
核心问题分析
C风格字符串的空字符缺失导致乱码
当你用std::cout << signature输出char数组时,cout会将其当作C风格字符串处理——这类字符串要求必须以\0(ASCII值为0的空字符)结尾。你的signature数组长度仅为2,存入'B'和'M'后没有多余空间存放空字符,因此cout会持续读取数组后续的内存,直到遇到第一个空字符,这中间的随机内存数据就会被当作字符串的一部分输出,也就是你看到的BM�中的乱码。sizeof signature输出3的异常原因
正常情况下,char signature[2]的sizeof结果应为2。你得到3的问题出在memcpy的参数上:你使用了sizeof this->signature,如果你的代码是在类成员函数中,且类的成员变量signature长度为3,或者你误将局部数组定义成了char signature[3];,都会导致这个结果。另外,若在非成员函数中使用this->本身属于编译错误,说明你可能混淆了局部变量和类成员变量的名称,导致sizeof取到了成员变量的大小而非局部数组的。
解决方法
修正
memcpy的使用
数组名signature本身就是指向数组首元素的指针,无需加&;第三个参数直接用sizeof(signature)获取局部数组的大小,避免this->带来的混淆:memcpy(signature, arr, sizeof(signature));避免输出乱码的两种方式
方法一:逐个输出数组元素,不依赖C风格字符串的规则:std::cout << signature[0] << signature[1] << std::endl;方法二:修改数组长度以容纳空字符(需将数组定义改为长度3):
char signature[3]; memcpy(signature, arr, 2); signature[2] = '\0'; // 手动添加字符串结束符 std::cout << signature << std::endl;检查数组定义与
sizeof的使用
确认signature的实际定义为char signature[2];,且memcpy的第三个参数确实指向该局部数组的大小,不要错误引用类成员变量的signature(除非你明确需要这么做)。
内容的提问来源于stack exchange,提问作者John Murray

