【问题标题】:How to get float address for use with memcpy?如何获取用于 memcpy 的浮动地址?
【发布时间】:2017-10-02 22:50:44
【问题描述】:

我正在尝试用浮点变量的内存地址填充字节/字符数组(数组长度为 4 字节 = 指针),但无论我做什么,它都会得到浮点值而不是地址:

float f = 20.0f;

memcpy(data, &f, sizeof(data));

调试它:

printf("Array: %#X, %#X, %#X, %#X", data[0], data[1], data[2], data[3]);

...以十六进制格式给出浮点值(20.0):

Array: 0, 0, 0XA0, 0X41

我需要的是浮点数的内存地址。我尝试以一些不同的方式强制转换/取消引用它,但无法让它工作......

【问题讨论】:

  • 感兴趣的问题,为什么需要它?

标签: c++ c pointers memory-address memcpy


【解决方案1】:

memcpy 是这样工作的:它需要一个指向 data 的指针,它将被复制。您的 data 是指向浮点数的指针,因此您需要将指针传递给指向浮点数的指针:

#include <cstring>

int main() {
   float f = 20.0f;
   float* pf = &f;
   char data[sizeof(pf)];
   memcpy(data, &pf, sizeof(data));
}

【讨论】:

  • 也许您还应该提到,在 64 位机器(现在很常见)上,指针应该占用 8 个字符/字节。
  • @Bob__:当然,谢谢! Zax Ftw:阅读以上内容,总的来说,最好在单独的问题中描述你在做什么,并询问这是否是一件好事
  • 但这是 32 位的,所以指针是 4 个字节,我不想发布更多细节,因为它完全不相关和利基的东西。
【解决方案2】:

对于 C 解决方案,将十六进制数据保存到 复合文字

#include <stdio.h>

int main(void) {
  char data[sizeof (float*)];
  printf("%p\n", (void*) data);
  float f;
  printf("%p\n", (void*) &f);

  memcpy(data, &(float *){&f}, sizeof (float*));
  for (unsigned i = 0; i<sizeof data; i++) {
    printf("%02hhX ", data[i]);
  }
  puts("");
}

输出

0xffffcba8
0xffffcba4
A4 CB FF FF 00 00 00 00 

地址在区块结束前有效。
根据需要调整字节序/打印顺序。

【讨论】:

  • 很好奇为什么这种复合文字不能在 C++ 中编译。我真的很喜欢这种单行解决方案,但是括号错误太多。
  • @ZaxFtw IIRC,C++ 不支持复合文字。见Are compound literals Standard C++?
猜你喜欢
  • 2021-11-05
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2012-07-19
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多