免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6543 | 回复: 15
打印 上一主题 下一主题

[C++] 关于const char *与string之间的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-28 12:05 |只看该作者 |倒序浏览
#include <string>
using namespace std;

void test1(const char * p)
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("%s", p);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//p数据正常

&nbsp;&nbsp;&nbsp;&nbsp;return;
}

string test2(char *p)
{
&nbsp;&nbsp;&nbsp;&nbsp;string str(p);
&nbsp;&nbsp;&nbsp;&nbsp;return str;
}

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;char * s = "adfg";
&nbsp;&nbsp;&nbsp;&nbsp;test1(test2(s).c_str());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//test1内数据正常

&nbsp;&nbsp;&nbsp;&nbsp;const char * p = test2(s).c_str();&nbsp;&nbsp;&nbsp;&nbsp;//数据不正常

&nbsp;&nbsp;&nbsp;&nbsp;string str = test2(s);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据正常

}


如果按照C的理解        
test1(test2(s).c_str()); 中也是调用const char * p = test2(s).c_str();
而直接const char * p = test2(s).c_str(); 数据却不正常
即使我使其调用一次赋值重载也是不行
const char * p;
p = test2(s).c_str();  //数据不正常


执行原理谁能帮我解释一下?

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
2 [报告]
发表于 2010-01-28 12:41 |只看该作者
test1(test2(s).c_str());
整句执行了完了,test2的返回值才析构,而在析构之前,返回值的内容已经被你传到test1里面printf。
const char * p = test2(s).c_str();
也是整句执行了完了,test2的返回值做析构,但是你之后再访问p为时已晚。

论坛徽章:
1
2017金鸡报晓
日期:2017-02-08 10:33:21
3 [报告]
发表于 2010-01-28 12:57 |只看该作者
const char * p = test2(s).c_str();    //数据不正常
这个怎么看的,我打印一下是正常的,不知道楼主是用什么编译器的

论坛徽章:
0
4 [报告]
发表于 2010-01-28 13:10 |只看该作者
哦?是吗?
我在WIN下用的VC2005
我换GCC试试

论坛徽章:
0
5 [报告]
发表于 2010-01-28 13:15 |只看该作者
原帖由 w_anthony 于 2010-1-28 12:41 发表
test1(test2(s).c_str());
整句执行了完了,test2的返回值才析构,而在析构之前,返回值的内容已经被你传到test1里面printf。
const char * p = test2(s).c_str();
也是整句执行了完了,test2的返回值做析构 ...


string str = test2(s);        //数据正常
是因为调用了拷贝构造?

如果是那样 值传递那里 我只能理解为
先赋值给一个临时的string,再去赋值const char *
或者用const char *接test2返回值的时候 拷贝构造没执行成功

[ 本帖最后由 奥丁@ 于 2010-1-28 14:21 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2010-01-28 13:20 |只看该作者
原帖由 w_anthony 于 2010-1-28 12:41 发表
const char * p = test2(s).c_str();
也是整句执行了完了,test2的返回值做析构 ...


test2返回值为什么析构? 它应该返回副本啊

论坛徽章:
0
7 [报告]
发表于 2010-01-28 13:23 |只看该作者
原帖由 hzsjx 于 2010-1-28 12:57 发表
const char * p = test2(s).c_str();    //数据不正常
这个怎么看的,我打印一下是正常的,不知道楼主是用什么编译器的


用GCC看了下 真能输出啊。。

论坛徽章:
0
8 [报告]
发表于 2010-01-28 15:20 |只看该作者
你打印一下
const string& p = test2(s);

论坛徽章:
0
9 [报告]
发表于 2010-01-28 15:25 |只看该作者
我觉得2楼是对的,在GCC里面内容正常只是因为字符串的内容还没被覆盖而已。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
10 [报告]
发表于 2010-01-28 15:33 |只看该作者
原帖由 奥丁@ 于 2010-1-28 13:20 发表


test2返回值为什么析构? 它应该返回副本啊


可以理解为到分号结束就析构了,这与它返回啥东西没关系。
const char* p = test2(s).c_str();
析构以后的内存并不是物理上删除(内存页面还在),只是逻辑上删除(标志为空闲内存),这时候再访问这块内存的结果是未定义的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP