You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:15:03