QT Invalid parameter passed to C runtime function和Q_ASSERT size 0 offset 0 size_t(offset)

本文详细解析了在QT软件开发中使用QByteArray发送串口数据时遇到的两个常见错误:Invalid parameter passed to C runtime function 和 Q_ASSERT断言失败。通过分析问题原因,指出错误通常源于空指针调用、数据类型定义不当导致的溢出以及QByteArray大小设置不合理。文章提供了修改数据类型和检查QByteArray大小的有效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写QT软件时,使用QByteArray来进行串口数据发送时,碰到如下报错问题:

(1)Invalid parameter passed to C runtime function;

(2)Q_ASSERT(size == 0 || offset < 0 || size_t(offset) >= sizeof(QArrayData));

经过查找资料问题原因可能是:

问题1原因:调用函数是传递了空指针,有个空指针或者无效的野指针在操作;

问题2原因:QByteArray的大小size=0或偏移offset<0或size_t(offset) >= sizeof(QArrayData);

进入调试模式,发现数据字节变量定义的数据类型为quint8,最大值为255,而实际需要发送的一包数据最大会是超过498个字节,问题就出在变量的数据类型定义与赋值溢出这里,因此需将数据字节变量的数据类型定义为quint16:

1、数据字节变量及发送缓存定义

QByteArray sendData;
quint8 mid_u16DatBytes = 0;  

2、数据字节变量操作及发送缓存大小设置

执行完上图第1句时变量值为:

发送缓存大小设置完后如下图,可见sendData为空:

总结:

由上述可知,报上述两种错误时,可好好查一下对QByteArray的操作特别是大小定义这块是否有问题,为了提高代码的健壮性,同时建议可在对QByteArray进行操作和定义大小时,可先判断一下QByteArray的大小是否为0或越界操作。如上述代码可修改为:

mid_u16DatBytes = m_u16LoraPacketDatByteNum + 14;

if(mid_u16DatBytes > 0)

{

    sendData.resize(mid_u16DatBytes);

    if(mid_u16DatBytes < 本帧数据应发数据字节数)

        { sendData[8] = (u8)(m_u16LoraPorgDatPacketIndex >> 8); ……}

}

else

    //报错或其他处理

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值