求大神解答下面代码!

stxl1154584a2 2013-07-30 07:09:10
#include<iostream>
#include <string>
using namespace std;
int main()
{
string str1="00";
string str2="11";
memcpy(&str1,&str2,sizeof(string));
str1[0]='2';
cout<<str1<<endl<<str2<<endl;
return 0;
}

输出为什么是21和21?
...全文
188 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-07-31
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
请叫我杨二哥 2013-07-31
  • 打赏
  • 举报
回复
其中的问题关键在于memcpy,虽然你申请了两个临时变量str1 str2,但是你在使用memcpy的时候是把&str2的内容拷贝到&str1里面去了的,memcpy是完全的拷贝,所以str1和str2其中的内容完全一样,包括那个指向存储字串的成员变量的指针值,所以你修改了str1的内容str2的内容也就跟着改变了,这个你可以跟代码看到的
buyong 2013-07-31
  • 打赏
  • 举报
回复
memcpy(&str1,&str2,sizeof(string)); wow
zhctj159 2013-07-31
  • 打赏
  • 举报
回复
此题涉及string的结构,使用memcpy复制时string结构体str2覆盖了string结构体str1,string体内包含_Ptr变量,用来指向一个字符数组,所以_Ptr也被覆盖,即两者拥有同一个字符数组。而使用下表引用string里的字符时如str1[0]='2';实际上相当于str1._Ptr[0]='2';又相当于str2._Ptr[0]='2';;所以打印出来的两个值是相同的,都是21
stxl1154584a2 2013-07-30
  • 打赏
  • 举报
回复
原来如此
大尾巴猫 2013-07-30
  • 打赏
  • 举报
回复
引用 2 楼 stxl1154584a2 的回复:
我只是好奇为什么都变成了21,按理说str2的值应该不会变才对啊!
string的对象中不是直接存放字符串的,是用一些变量、指针来管理一个字符串,这个字符串是new出来,地址在别的地方。 你把str2管理字符串的一套数据内存拷贝到str1,str1的那些指针也指向str2管理的字符串。 所以对str1[0]做的操作,直接反映在str2上。他们管理的是同一个字符串。
max_min_ 2013-07-30
  • 打赏
  • 举报
回复
引用 2 楼 stxl1154584a2 的回复:
我只是好奇为什么都变成了21,按理说str2的值应该不会变才对啊!
不要相信这个打印出来的值, 是垃圾值而已!代码中的堆栈都破坏了! 那里会有有效值呢!
大尾巴猫 2013-07-30
  • 打赏
  • 举报
回复
string又不是char*可以直接memcpy的 很多对象都不能直接内存拷贝,要用赋值和构造。
stxl1154584a2 2013-07-30
  • 打赏
  • 举报
回复
我只是好奇为什么都变成了21,按理说str2的值应该不会变才对啊!
max_min_ 2013-07-30
  • 打赏
  • 举报
回复

虽然输出来了都是21,但是堆栈完全被破坏了!
这代码写的!
是要这样的目的阿?
还是拿来请大神讲解的?

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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