QString的问题

AAA20090987 2011-08-29 09:01:05
加精
先上代码:
#include <QtCore>
#include <iostream>
using namespace std;

//1:
int main(int argc, char **argv)
{
QString qstr = "asdjfhasfdlsdas";
const char *p = qstr.toStdString().c_str();
printf("%s\n", p);
return 0;
}


2:
为什么第一段代码输出的空,而第二段代码却能正常输出呢?
int main(int argc, char **argv)
{
QString qstr = "asdjfhasfdlsdas";
string str = qstr.toStdString();
const char *p = str.c_str();
printf("%s\n", p);
return 0;
}
...全文
2002 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
shwarpine 2013-07-18
  • 打赏
  • 举报
回复
引用 37 楼 feidaosh 的回复:
这两段代码都不好,第二段代码能打印出结果是有严格条件的。 上面大家说得没错,而string str = qstr.toStdString();这一句话是其中的关键,这里的=不是一个简单的赋值,而是一个拷贝过程。qstr.toStdString()返回的对象在这句话结束后就解构了(或者叫释放了),所以在这句语句结束后再引用它内部的地址,给出的内容是不确定的。 而第二段代码也不是一段好的代码,因为其中的const char *p = str.c_str();也引用了一个函数调用的返回值,这里因为引用的是c_str(),而且得到*p后立即就打印了出来,所以才没出现错误。如果str变量在打印*p之前再经过一些其它操作,很有可能引起第二段代码也不能输出正确的结果。 比如 const char *p = str.c_str(); str.XXX() ...... printf("%s\n", p); 如果在第二段代码中直接写成 int main(int argc, char **argv) { QString qstr = "asdjfhasfdlsdas"; string str = qstr.toStdString(); printf("%s\n", str.c_str()); return 0; } 这样就不会有语义上可能存在的错误。 所以--指针少用。
学习了,虽然是半迷糊,以后消化。
zhoumin110 2011-09-17
  • 打赏
  • 举报
回复
学习了
蜗牛sf 2011-09-13
  • 打赏
  • 举报
回复
受教了
wqcvcyn 2011-09-12
  • 打赏
  • 举报
回复
好帖、学习了
cppbegginer 2011-09-05
  • 打赏
  • 举报
回复
我觉得你这里说的例子并不是指针的问题,而是代码风格的问题。你的const char *p获得值到最终使用,之间经历了较多代码,应该把const char *p放到printf("%s\n", p),风格改了,你说的隐患自然就没有了。

当需要时再定义,是比较好的风格。

[Quote=引用 37 楼 feidaosh 的回复:]
这两段代码都不好,第二段代码能打印出结果是有严格条件的。
上面大家说得没错,而string str = qstr.toStdString();这一句话是其中的关键,这里的=不是一个简单的赋值,而是一个拷贝过程。qstr.toStdString()返回的对象在这句话结束后就解构了(或者叫释放了),所以在这句语句结束后再引用它内部的地址,给出的内容是不确定的。
而第二段代码也不是一段好的代码,因为……
[/Quote]
夜很冷 2011-09-02
  • 打赏
  • 举报
回复
我来看看
AAA20090987 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 feidaosh 的回复:]

这两段代码都不好,第二段代码能打印出结果是有严格条件的。
上面大家说得没错,而string str = qstr.toStdString();这一句话是其中的关键,这里的=不是一个简单的赋值,而是一个拷贝过程。qstr.toStdString()返回的对象在这句话结束后就解构了(或者叫释放了),所以在这句语句结束后再引用它内部的地址,给出的内容是不确定的。
而第二段代码也不是一段好的代码,因……
[/Quote]

说得好
指针太灵活,像我这样的菜鸟还是少用为妙啦,呵呵。
念茜 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 feidaosh 的回复:]

这两段代码都不好,第二段代码能打印出结果是有严格条件的。
上面大家说得没错,而string str = qstr.toStdString();这一句话是其中的关键,这里的=不是一个简单的赋值,而是一个拷贝过程。qstr.toStdString()返回的对象在这句话结束后就解构了(或者叫释放了),所以在这句语句结束后再引用它内部的地址,给出的内容是不确定的。
而第二段代码也不是一段好的代码,因……
[/Quote]

分析的很好可是怎么结论就少用指针了…… 活用指针
feidaosh 2011-09-02
  • 打赏
  • 举报
回复
这两段代码都不好,第二段代码能打印出结果是有严格条件的。
上面大家说得没错,而string str = qstr.toStdString();这一句话是其中的关键,这里的=不是一个简单的赋值,而是一个拷贝过程。qstr.toStdString()返回的对象在这句话结束后就解构了(或者叫释放了),所以在这句语句结束后再引用它内部的地址,给出的内容是不确定的。
而第二段代码也不是一段好的代码,因为其中的const char *p = str.c_str();也引用了一个函数调用的返回值,这里因为引用的是c_str(),而且得到*p后立即就打印了出来,所以才没出现错误。如果str变量在打印*p之前再经过一些其它操作,很有可能引起第二段代码也不能输出正确的结果。
比如
const char *p = str.c_str();
str.XXX()
......
printf("%s\n", p);

如果在第二段代码中直接写成
int main(int argc, char **argv)
{
QString qstr = "asdjfhasfdlsdas";
string str = qstr.toStdString();
printf("%s\n", str.c_str());
return 0;
}
这样就不会有语义上可能存在的错误。

所以--指针少用。
ailinty 2011-09-02
  • 打赏
  • 举报
回复


这样不稳定,我试了,是好是坏!
QString qstr = "asdjfhasfdlsdas";
string str = qstr.toStdString();
const char *p = str.c_str();
printf("%s\n", p);


这样比较靠普!
char* cstr = QString("abcdef").toLocal8Bit().data();
seawh411 2011-09-01
  • 打赏
  • 举报
回复
谢谢楼主分享...
Chirive 2011-09-01
  • 打赏
  • 举报
回复
学习了
xubo1210 2011-09-01
  • 打赏
  • 举报
回复
关键是它为什么是野指针呢?
AAA20090987 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dbzhang800 的回复:]

引用 11 楼 yiyaaixuexi 的回复:

引用 10 楼 heyatao 的回复:

VC 10.0 编译运行的是空的。
MinGW 上为何可以输出呢?

MinGW可以输出?

输出什么都是有可能的,同一个编译器,不同的编译选项或优化级别,都会影响此时这个野指针所指向的内容。

关键是,它是野指针!!
[/Quote]

明白,谢谢指教
johnwangjohnwang 2011-08-31
  • 打赏
  • 举报
回复
谢谢楼主了,是个好东西
zmkkobe 2011-08-31
  • 打赏
  • 举报
回复
学到了,嘿嘿。
断问天 2011-08-31
  • 打赏
  • 举报
回复
使用指针的原则是指向一块已分配的内存
rhj_koko 2011-08-31
  • 打赏
  • 举报
回复
学习 。。。。。。。。
ralphzmr 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dbzhang800 的回复:]
引用 11 楼 yiyaaixuexi 的回复:

引用 10 楼 heyatao 的回复:

VC 10.0 编译运行的是空的。
MinGW 上为何可以输出呢?

MinGW可以输出?

输出什么都是有可能的,同一个编译器,不同的编译选项或优化级别,都会影响此时这个野指针所指向的内容。

关键是,它是野指针!!
[/Quote]
1234
qingfengbuyu 2011-08-31
  • 打赏
  • 举报
回复
谢谢指教
加载更多回复(19)

16,173

社区成员

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

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