我有一个必须将char指针转换为双指针的函数。最初代码编写为(double *)data
,其中数据是char *,但是这导致了cppcheck作为"不兼容的二进制数据表示的警告"并且,从我所读到的,通常不推荐在c ++中使用,因为它更像是一种c风格的方法。
我尝试了static_cast
,dynamic_cast
和reinterpret_cast
,但没有一个正常运作。 atof
可以转换为double,但我不能将其用于双* - double *vd = &atof(data)
- 因为它会抱怨lvalue required as unary ‘&’ operand
。
以下是我正在使用的示例:
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 *?
答案 0 :(得分:0)
C++
中的严格别名规则意味着您无法安全地将指针强制转换为任何类型。唯一可以合法地为其他类型设置别名的类型是char
,unsigned char
和std::byte
(C ++ 17)。
出于这个原因,您需要将<{1}}来源中的数据复制到正确对齐的char*
(或其他任何类型)。
例如:
double
请注意,标准未指定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
不一定在平台之间可移植。
答案 1 :(得分:0)
安全的方法是使用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);
}
问题在于这涉及大量复制。但问题是data
可能不适合双重对齐。
(执行此操作后,您可能希望更改在最后一行调用的exStateData
的重载,以获取对向量的引用 - 它使调用更加清晰。)