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技术培训专家

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

你可能感兴趣的:(QT学习,qt,数据类型转换)