通过取消引用指向字节数组的指针来分配值是错误的吗?
Is it wrong to assign value by dereferencing pointer to byte array?
我有一个代码,我在其中取消引用字节数组指针并将值分配给变量。这对于 int 和 bool 工作正常,但不适用于浮点型和双精度型。所以我认为我面临着一个普遍的问题。我做了一个样本:
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <algorithm>
using namespace std;
typedef unsigned char Byte;
int main( )
{
vector<Byte> v(10);
float f1 = 14.6;
copy_n((Byte*)&f1, sizeof(float), (Byte*)&v[4]);
float f2 = v[4];
float f3 = 0;
copy_n((Byte*)&v[4], sizeof(float), (Byte*)&f3);
cout << "f2: " << f2 << " f3: " << f3 << endl;
return 0;
}
std::copy_n
按预期工作,所以我必须使用它而不是f2 = v[4]
output: f2: 154 f3: 14.6
f2 = v[4]
建筑有什么问题?
float f2 = v[4]
发生的事情是这样的:float f2 = (float) v[4]
v[4]
是一个Byte
,又名无符号字符。你获取该元素(只是该元素)并将其转换为浮点数。
In v[4] you have the least significant byte of f1,
...
In v[7] you have the most significant byte of f1
它们被颠倒了,因为你的系统是小端序的。
对于int
它之所以有效,是因为您使用的值小于 128,并且系统是小端序。也就是说 v[4] 保存原始f1
的最低有效字节。与 float 一样,您忽略其他 3 个字节,但在这种情况下(int 小于 128),其余字节为 0,因此您看不到任何危害。
f2
是一个float
,v[4]
是一个unsigned char
。
因此,你可以从v[4]
赋值到f2
,但这需要一个值保留的转换。
由于您实际上想从索引 4 开始从 v
中提取float
的字节,这显然是错误的。
有了bool
和int
你很幸运,因为你的实现是小端序的,你想要复制的值小于SCHAR_MAX
。
您的copy_n
构造工作正常,因为您始终可以从字节数组复制任何琐碎的可复制对象(如内置类型),一次unsigned char
一个。
执行时
copy_n((Byte*)&v[4], sizeof(float), (Byte*)&f3);
您将构成浮点f1
的所有四个字节从字节缓冲区复制回浮点数,而当您这样做时
float f2 = v[4];
您只分配原始浮点数的最低有效字节f1
其值将被隐式转换为浮点数并分配给f2
。
它通过取消引用指向字节数组的指针来分配值是错误的吗?
通常不是,但在这里它没有什么意义,因为您正在尝试从缓冲区中提取浮点数。
- 通过双指针分配指针
- 在不工作的情况下为数组分配指针,但反过来也可以
- 无法使用"std::make_shared"分配指针
- 分配指针时出现分段错误
- 为什么有时仅使用Ampersand运算符在C 中分配指针
- 重新分配指针阵列的一部分的安全方法
- 为什么在执行增量操作之前分配指针值
- 当指针指向的对象被另一个类的实例删除时,重新分配指针
- 在堆上分配指针的原因是什么?
- 有没有办法防止分配指针?
- 将运算符重写应用于具有动态分配指针的类
- 在堆上分配指针数组
- 在另一个结构中的结构内解除分配指针
- 分配指针后,是否可以为指针指向的事物分配变量名称?
- 重新分配指针后,将类功能与指针一起使用
- 为什么我的新分配指针会自动在程序退出上删除
- 分配指针的方法之间有什么区别?
- 如何声明和分配指针
- 内存分配(指针和堆栈)
- 通过参数分配指针的值