C++提示cast from ‘char**’ to ‘char’ loses precision错误怎么解决
报错原因
- 编译错误的直接触发原因是类型转换逻辑完全错误:你定义的
pADdata已经是指向结构体首地址的char*类型变量,对它取地址&pADdata得到的是char**(指针的指针),你后续将其强转为1字节长度的char类型,远小于指针本身的内存长度(64位系统下为8字节,32位系统下为4字节),自然会报精度丢失的错误。 - 额外还有语法错误:报错行的函数调用多了冗余括号,语法本身不合法。
- 隐藏的逻辑错误:你的结构体中使用了
std::string类型,这是动态容器,内部仅存储指向堆内存的指针,直接对结构体做二进制收发只能拿到无效的指针地址,无法传输实际的字符串内容,运行时会出现乱码、崩溃等问题。
修复方案
第一步:修复编译错误
如果你的接收函数prijem_dat的第一个参数要求传入接收缓冲区的char*类型指针,直接传结构体首地址转换后的指针即可,不需要额外定义二级指针:
typedef struct LOGIN { // 注意:此处std::string的问题后续还需处理 mutable std::string name; mutable int heslo; }TCP_LOGIN; void rec_data(BYTE dats) { LOGIN myPtr; // 直接传入结构体首地址转char*,同时需要传入缓冲区长度作为第二个参数 Server->prijem_dat(reinterpret_cast<char*>(&myPtr), sizeof(myPtr)); }
第二步:修复逻辑错误,支持正常收发结构体
由于std::string无法直接做二进制传输,建议将结构体中的字符串改为固定长度的char数组:
// 修改后支持直接二进制收发的结构体定义 typedef struct LOGIN { char name[64]; // 可根据实际需要调整数组最大长度 int heslo; }TCP_LOGIN; void rec_data(BYTE dats) { LOGIN myPtr; // 传入缓冲区指针和缓冲区总长度,接收完成后即可直接访问结构体成员 Server->prijem_dat(reinterpret_cast<char*>(&myPtr), sizeof(TCP_LOGIN)); }
如果必须使用std::string存储用户名,需要自定义序列化逻辑:先接收4字节的字符串长度,再根据长度接收对应字节数的内容写入std::string对象,最后再接收int类型的heslo字段,不能直接收发整个结构体。
内容的提问来源于stack exchange,提问作者Aiysis Adys Iag
相关产品推荐
相关产品推荐

