qDebug() 不能输出预期的结果,为什么?

hjjdebug 2018-11-29 03:43:57
#include <QDebug>
int main()
{
QString str("test");
char *p = str.toLatin1().data();
qDebug()<< p;
return 0;
}

输出是乱码,得不到test 字串。
如果换成qDebug<<str.toLatin1().data() ; 是可以得到正确输出的。
为什么先付给指针,再导出指针就不对了呢?
百思不得解,难道是qt 的bug 吗?
...全文
821 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjjdebug 2018-12-03
  • 打赏
  • 举报
回复
我已经知道原因了. 说是qt bug 也未尝不可. 是qDebug()对象破坏了str.toLatin1().data() 指针所指的内容。你可以做以下一个实验
cat test.cpp
#include <QDebug>
int main()
{
QString str("test");
char *p = str.toLatin1().data();
printf("p:%p,p:%s\n",&p,p);
qDebug()<< "";
printf("p:%p,p:%s\n",&p,p);
return 0;
}
hjj@hjj-Inspiron:~/test$ ./test
p:0x7fff0a3f5588,p:test

p:0x7fff0a3f5588,p:

该例说明,返回的指针指向一个数据区,本来是挺好的, 但qDebug() 对象也使用该区域操作,结果内容就被破坏掉了。知道它的原因就可以了。
感谢大家参与讨论!
云山大侠 2018-11-30
  • 打赏
  • 举报
回复
const char *QByteArray::data() const

const
Island117 2018-11-30
  • 打赏
  • 举报
回复
我测了也不行,估计有两种可能,一种是str.toLatin1().data()返回的是临时变量,这条语句结束后就没了,我改用

char p[20];
strcpy(p,str.toLatin1().data());

这样就可以了。

另一种可能是,str.toLatin1().data()返回的是私有变量,不许外部指针引用。
不易易 2018-11-30
  • 打赏
  • 举报
回复
我这里可以输出test啊,奇怪不~
hjjdebug 2018-11-30
  • 打赏
  • 举报
回复

char *data();
const char *data() const;


两种都可以的,这不是问题所在, 你可以试试,两种方式都不会有正确输出。
不过对你的细心表示感谢!

16,213

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧