C++ 如何将char*转换为double*?

C++ 如何将char*转换为double*?,c++,casting,C++,Casting,我有一个函数,它必须将char指针转换为双指针。最初代码是写为(双*)数据< /> >,其中数据是char *,但是这引起了一个警告,CPPCHECK是一个“不兼容的二进制数据表示”,从我读到的,在C++中一般不推荐它,因为它更像是C风格的方法。 我试过static\u cast,dynamic\u cast,以及reinterpret\u cast,但都没有成功atof可以转换为double,但我不能将其与double*-double*vd=&atof(data)-一起使用,因为它将左值作为一

我有一个函数,它必须将char指针转换为双指针。最初代码是写为<代码>(双*)数据< /> >,其中数据是char *,但是这引起了一个警告,CPPCHECK是一个“不兼容的二进制数据表示”,从我读到的,在C++中一般不推荐它,因为它更像是C风格的方法。 我试过
static\u cast
dynamic\u cast
,以及
reinterpret\u cast
,但都没有成功
atof
可以转换为double,但我不能将其与double*-
double*vd=&atof(data)
-一起使用,因为它将
左值作为一元操作数“&”进行投诉

以下是我正在使用的示例:

exStateData convertToStateData(char* data, int size) {
    ...
    unsigned int vd_size = *((unsigned int*) data);
    data += sizeof(unsigned int);
    ...
    double *vd = (double*)data;
    return exStateData(vd, vd + vd_size);
}

如何将char*转换为double*?

C++
中严格的别名规则意味着您无法安全地将指针转换为任何类型。唯一可以合法别名其他类型的类型是
char
unsigned char
std::byte
(C++17)

因此,您需要将
char*
源中的数据复制到正确对齐的
双精度
(或任何其他类型)中

例如:

double get_from_char_array(char const* buffer)
{
    // correctly aligned double
    double d;

    // get the address of the double and convert it
    // to a char pointer because char pointer can alias
    // any other type
    char* dp = reinterpret_cast<char*>(&d);

    // copy the data out of the buffer into the
    // memory occupied by the double d
    std::copy(buffer, buffer + sizeof(double), dp);

    return d;
}
double-get\u from\u char\u数组(char const*buffer)
{
//正确对齐的双
双d;
//获取double的地址并将其转换
//指向char指针,因为char指针可以是别名
//任何其他类型
char*dp=重新解释铸件(&d);
//将数据从缓冲区复制到
//双d占用的内存
std::复制(缓冲区,缓冲区+sizeof(双精度),dp);
返回d;
}

请注意,
double
的二进制表示形式未在标准中指定,因此以这种方式转换
double
不一定可以在平台之间移植。

安全的方法是使用memcpy:

exStateData convertToStateData(char* data, int size) {
    ...
    unsigned int vd_size;
    memcpy( &vd_size, data, sizeof(vd_size));
    data += sizeof(vd_size);
    ...
    std::vector<double> vd(vd_size);
    memcpy(&vd[0], data, vd_size*sizeof(double));
    return exStateData(&vd[0], &vd[0] + vd_size); 
}
exStateData convertToStateData(字符*数据,整数大小){
...
无符号整数VDU大小;
memcpy(&vd_大小、数据、大小(vd_大小));
数据+=尺寸(vd_尺寸);
...
std::矢量vd(vd_尺寸);
memcpy(&vd[0],数据,vd_大小*sizeof(双精度));
返回exStateData(&vd[0],&vd[0]+vd_大小);
}
问题是这需要大量的复制。但问题是,
数据
可能不适合双精度对齐


(一旦这样做,您可能需要更改最后一行调用的
exStateData
的重载,以引用向量-这会使调用更清晰)。

实际上根本不清楚您要做什么以及为什么要这样做。你能给我们提供足够的代码来理解你想做什么吗?你能给我们做一个演示吗?注:MCVE应包括各种样本输入(说明所有方面)和所需输出。此外,即使您可以获取
atof
返回值的地址,也对您没有好处。一旦该语句完成,该值就不再存在,因此您将拥有一个现在不存在的临时值的前地址。(你可能会尝试,这表明你的问题背后可能存在一些误解,但我们无法判断是不是或是哪个。)我正在添加一个示例,它将在几分钟内正确输入。你的代码真的没有多大意义。您如何知道
数据
(递增后)正确对齐以从中读取
双精度
?您试图做一些平台特定的事情,这些事情永远不会安全。(如果
int
是四个字节,而
double
是八个字节,该怎么办?您可能试图取消引用一个不可能指向double的指针,因为它没有在八个字节的边界上对齐。)