首页 > 解决方案 > 在 C++ 中交换内存

问题描述

我正在尝试交换堆栈上的一些寄存器值。例如 L0,L1...L10 应该变成 L10,L9,..L0。这些寄存器值存储在缓冲区“target_types::buf”中。

void reverse_local_regs(int size, int offset)
{
  const int BYTES_PER_REGISTER = 4;
  uint8_t temp_reg[BYTES_PER_REGISTER];
  for (int i = 0; i < size; i += BYTES_PER_REGISTER)
  {
    memcpy(temp_reg, &target_types::buf[offset + i], BYTES_PER_REGISTER);
    memcpy(&target_types::buf[offset + i], &target_types::buf[offset + size - i - 4], BYTES_PER_REGISTER);
    memcpy(&target_types::buf[offset + size - i - 4], temp_reg, BYTES_PER_REGISTER);
  }
}

我写了这个函数,但它根本不会改变内存。为了验证内存是否保持不变,我编写了以下代码,打印“Same mem”。

  uint8_t test[2048];
  memcpy(test, target_types::buf, 2048);
  reverse_local_regs(BYTES_PER_REGISTER * FL, FP_SR_PC_offset);
  if (memcmp(test, target_types::buf, 2048) == 0)
    std::cout << "Same mem" << std::endl;
  else
    std::cout << "different mem" << std::endl;

我究竟做错了什么?

标签: c++memcpy

解决方案


我认为它需要括号,
迭代器也i应该停在一半,size
否则它会在下半场换回

void reverse_local_regs(int size, int offset)
{
  const int BYTES_PER_REGISTER = 4;
  uint8_t temp_reg[BYTES_PER_REGISTER];
  for (int i = 0; i < size/2; i += BYTES_PER_REGISTER)
  {
    memcpy(temp_reg, &target_types::buf[offset + i], BYTES_PER_REGISTER);
    memcpy(&target_types::buf[offset + i], &target_types::buf[offset + (size - (i + 4))], BYTES_PER_REGISTER);
    memcpy(&target_types::buf[offset + (size - (i + 4))], temp_reg, BYTES_PER_REGISTER);
  }
}

推荐阅读