【问题标题】:C++ memcpy not copying as expectedC ++ memcpy未按预期复制
【发布时间】:2020-11-04 05:56:10
【问题描述】:
    BYTE* uMemory;
    std::string data = "00 00 00 2D 01 00 B0 F9 1E 00"
    data.erase(remove_if(data.begin(), data.end(), isspace), data.end());

    int address = 0;
    for (int i = 0; i < data.length(); i += 2)
    {
        std::string data_1 = data.substr(i, 2);
        int num2 = std::stoi(data_1, 0, 16);
        memcpy(&uMemory + address, &num2, 2);
        address++;
    }

我正在尝试将其复制到内存中 (2E 01 00 00 00 2D 01 00 B0 F9 1E 00) 用于 uMemory,但我不明白它的逻辑。

无论我希望它复制多少字节,它在内存中总是这样结束:

00 00 00 00 00 00 00 00 00 01 00 00 2D 00 00 00 01 00 00 00 00 00 00 00 B0 00 00 00 F9 00 00 00 1E 00 00 00

【问题讨论】:

  • 因为uMemory 未初始化。这是故意的吗?还有&amp;uMemory是局部变量uMemory的地址。
  • 这里不需要memcpy()uMemory[address++] = num2; 应该可以工作,但是你需要正确初始化uMmemory
  • 这是一个相当,嗯,低效的解码十六进制数据的方法。
  • uMemory[address++] = num2;最初可以工作,但后来它在内存中变得混乱。如何正确初始化它..因为我尝试的所有内容都阻止了正确的值被复制。
  • 之所以这样,是因为字符串取自用户输入,因此并不总是“00 00 00 2D 01 00 B0 F9 1E 00”

标签: c++ memory memcpy


【解决方案1】:

你的直接问题是uMemory是一个指针,并且在行

memcpy(&amp;uMemory + address, &amp;num2, 2);

你正在形成一个指向指针的指针&amp;uMemory 的类型为 BYTE**,因此当您进行指针运算时,您每次都会移动一个指针宽度,根据您的输出判断,这在您的平台上显然是 4 个字节。

当您在此处写入时,您还破坏了内存的随机部分,可能是保存data 对象本身的内存(因为这是在指针之后立即声明的内容。)

【讨论】:

    【解决方案2】:

    这是我的解决方案。如果可能的话,我会喜欢一些更好的编码实践的替代方案。

        std::atomic<BYTE> uMemory[256];
        int address = 0;
        std::vector<BYTE> array;
        for (int i = 0; i < data.length(); i += 2)
        {
            std::string data_1 = data.substr(i, 2);
            DWORD num2 = std::stoi(data_1, 0, 16);
            array.push_back(num2);
        }
    
        std::copy(std::begin(array), std::end(array), std::begin(uMemory));
    

    我唯一不明白的是,我必须拥有 std::atomic 才能使内存不会变得随机。有没有其他方法可以做到这一点?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      相关资源
      最近更新 更多