免费注册 查看新帖 |

Chinaunix

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

[C] 求C高手,解决有关malloc与new的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-27 19:30 |只看该作者 |正序浏览
本人有这样一段程序,是错误的程序,但从中产生了一个疑惑,程序如下:
  1. string value = "ok";
  2. void * res = NULL;
  3. int strSize = sizeof(char)*value.size() + sizeof(char);
  4. res = malloc(strSize);
  5. std::string* temp = new string(value);
  6. memcpy(res, temp, sizeof(std::string));

  7. cout<<*(string*)res<<endl;
复制代码
编写该程序的初始目的是将value的值复制到指针res中,当然,上述程序是错误的,
但求高手解答,为什么当value的大小是2的时候,最后一句代码输出结果正常,
但是却报出指针地址不能读写的运行时错误,可当value的大小不是2时,一切都正常?
太神奇了吧,谢谢大家了

论坛徽章:
0
7 [报告]
发表于 2010-05-28 15:18 |只看该作者
回复 6# linuxlixk


    我也是,但是现在在搞C++,还是MFC,疼死我了

论坛徽章:
0
6 [报告]
发表于 2010-05-28 14:22 |只看该作者
{:3_189:}从来不迷恋C++

论坛徽章:
0
5 [报告]
发表于 2010-05-28 11:28 |只看该作者
乱七八糟,lz先把自己的思路理好,不是什么都可以拷贝的

论坛徽章:
0
4 [报告]
发表于 2010-05-27 23:25 |只看该作者
当value.size()为2时,在x86下
strSize == 3
sizeof(std::string) == 4
因此你的memcpy越界了。
而且即使你长度对了,这么复制也是错误的。

论坛徽章:
0
3 [报告]
发表于 2010-05-27 22:10 |只看该作者
很神奇,lz这么用不是给自己找罪受嘛

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-05-27 19:52 |只看该作者
1. 你用的是memcpy 而不是strcpy
2. string的第一个成员就是 _CharT* _M_p; // The actual data.
3. sizeof(std::string) 只是 std::string 这个类所占用的空间,并不是字符串的长度
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP