You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

memcpy行为不符合预期:复制2字节char数组后输出异常求助

问题原因与解决方法

核心问题分析

  1. C风格字符串的空字符缺失导致乱码
    当你用std::cout << signature输出char数组时,cout会将其当作C风格字符串处理——这类字符串要求必须以\0(ASCII值为0的空字符)结尾。你的signature数组长度仅为2,存入'B'和'M'后没有多余空间存放空字符,因此cout会持续读取数组后续的内存,直到遇到第一个空字符,这中间的随机内存数据就会被当作字符串的一部分输出,也就是你看到的BM�中的乱码。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:01:19