c++ - 在 C++ 中使用 float 的 Memcpy

标签 c++ memcpy

我对看似极其简单的代码有疑问,但它根本没有按照我的预期去做:

代码:

char b[sizeof(float)];
float a = 1.5f;
memcpy(b, &a, sizeof(float));
printf("%f\n", b[0]);

输出:

62827075002794546937726511559700164562271693617156259118887055013962964939146547
22493354730179062365918845182857228200743453702107162763566167344423902681816648
14169764096333089859051972349071751428406066879715295195780847944297207011246001
33742258486014791122944.000000

但是当我这样做时它起作用了:

char b[sizeof(int)];
int a = 3;
memcpy(b, &a, sizeof(int));
printf("%i\n", b[0]);

输出:

3

为什么会这样?是因为字节顺序还是其他原因?

最佳答案

您的代码有未定义的行为。表达式 b[0]char (提升为 int ),以及格式说明符 %f期望一个 double .

(对于您看到的输出可能有多种解释。想到的最紧迫的一个是 double 在您的平台上比 int 更宽,并且读取了垃圾内存。如果您想要一个稍微更可预测的实验,尝试将 static_cast<uint64_t>(b[0]) 作为参数传递。)

关于c++ - 在 C++ 中使用 float 的 Memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20821086/

相关文章:

c - 如何从子进程更新共享数据?

c - “大小 8 的无效读取”- Valgrind。尝试用来自其他结构的数据填充结构

c++ - gcc 中的错误,或 clang/MSVC 中的扩展

c++ - 使用变量的类型作为模板参数

c++ - 我应该停止使用术语 C/C++ 吗?

c++ - VS2015 中奇怪的 memcpy_s 行为

c++ - 可以使用 memcpy() 复制包含指针的结构吗?

c++ - 带有初始化变量和负数的 memcpy

c++ - 在派生类中使用指向基类的指针访问基类保护成员

c++ 什么时候包含 cpp 即使我们有 .h 文件