QT踩坑:QString 转 char * 乱码出错

QString 转 char * 乱码出错

问题描述

最近因为项目需求,涉及到串口接收数据后解析数据问题,使用自己写的串口调试助手以及两个 RS485 模拟的数据收发,已测试过两线 RS485 无法自发自收,需要两个相互收发才行,在网上也查阅了相关资料,说的是两线 RS485 是通过差分信号进行数据收发,属于半双工通信,得用四线才行,先不纠结这个问题,下面来说一下数据类型转换乱码出错的问题,出错的代码如下:

QSrting str = "XXXXX";
char *arr = str.toLocal8Bit().data();

以上代码时而正常,时而出错,调试的时候偶尔也是这样。

解决方案

这代码逻辑很难看出有啥问题,但是他确实存在问题,简单的 QString 转 char * 得先通过 toLocal8Bit() 方法转 QByteArray, 然后再通过 QByteArray 的 data() 方法转 char *,转换的逻辑和流程确实没有问题,但是它存在编译逻辑问题!

这个问题使用QT creator调试一下代码就可以发现为什么有问题了。
当然直接观察反汇编代码可能更加直观。
根本原因在于,这几种代码形式中,QByteArray::~QByteArray()operator<<() 的执行次序不同。如果先 operator<<() 后执行 QByteArray::~QByteArray() 就没问题,反过来的次序就有问题。

上面是一位叫做QT技术培训专家大佬的回答,还附有一张代码图片,这里就不用图片了,容易失效,这里小编就用代码来写一次,代码及注释如下:

{
	QString s = "hello world";
	qDebug() << s;

	//执行 QByteArray toUtf8() const &
	//执行 operator<<()
	//执行 QByteArray::~QByteArray()
	qDebug() << s.toUtf8().data();

	//执行 QByteArray toUtf8() const &
	//执行 QByteArray::~QByteArray()
	//执行 operator<<()
	//p 指向的数据所在内存已经释放掉了
	char *p = s.toUtf8().data();
	qDebug() << p;

	//执行 QByteArray toUtf8() const &
	//执行 operator<<()
	//执行 QByteArray::~QByteArray()
	QByteArray b = s.toUtf8();
	p = b.data();
	qDebug() << p;
}

这里纠正一下,p 指向的数据所在内存已经释放掉了 应该还是有点问题,因为我调试的时候,它偶尔也是正常的,已经释放掉了存在概率性问题,比较幸运的时候,它是没有被释放的,能够正确打印数据。

参考:
Qt QString转char* 为什么乱码?-QT技术培训专家

学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是混子我怕谁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值