免费注册 查看新帖 |

Chinaunix

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

[函数] memcpy复制struct的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-10 14:35 |只看该作者 |倒序浏览
定义一个如下的struct
typedef struct clientdata
{
        char SessionID[4];
        char StudentID[9];
        char EndByte;
        char data[32];                        // should add '\n' at the end
} clientdata;

我想把该struct的前30个字节复制到另一块内存中,使用如下的memcpy出了问题。
clientdata Clientdata;
strcpy(Clientdata.Session, "0000");
strcpy(Clientdata.StudentID, "200971689");
Clientdata.EndByte = 1;
strcpy(Clientdata.data, "This is a test");

char *tmp = new char [31];
memcpy(tmp, (char *)&Clientdata, 30);

vc中执行的结果是tmp指向内存的内容是:00002000971689

这是为什么呢?memcpy应该是不理会\0,但是StudentID后面的内容又没有复制进来。

论坛徽章:
0
2 [报告]
发表于 2009-11-10 15:03 |只看该作者
vc中执行的结果是tmp指向内存的内容是:00002000971689
你是如何看的?用cout或者printf?
那如果EndByte是\0就没打出来后面的了吧?
要不循环一下把每个字符打出来吧

论坛徽章:
0
3 [报告]
发表于 2009-11-10 16:14 |只看该作者

  1. #include <stdio.h>
  2. #include <string.h>

  3. typedef struct clientdata
  4. {
  5.         char SessionID[4];
  6.         char StudentID[9];
  7.         char EndByte;
  8.         char data[32];
  9. } clientdata;

  10. int main()
  11. {
  12.         clientdata Clientdata;

  13.         strcpy(Clientdata.SessionID, "0000");
  14.         strcpy(Clientdata.StudentID, "200971689");
  15.         Clientdata.EndByte = 1;
  16.         strcpy(Clientdata.data, "This is a test");

  17.         char *tmp = new char [31];
  18.         memcpy(tmp, (char *)&Clientdata, 30);
  19.        
  20.         printf("%d\n", sizeof(clientdata));
  21.         printf(tmp);
  22.         return 0;
  23. }
复制代码


我运行怎么没有问题呢?

VC6,输出:
46
0000200971689This is a test

[ 本帖最后由 vime000 于 2009-11-10 16:31 编辑 ]

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
4 [报告]
发表于 2009-11-10 16:20 |只看该作者
memcpy 30就是30;strcpy,鬼才知道系多少

论坛徽章:
0
5 [报告]
发表于 2009-11-10 16:28 |只看该作者
内存对齐

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2009-11-10 17:43 |只看该作者
原帖由 zhanglistar 于 2009-11-10 14:35 发表
定义一个如下的struct
typedef struct clientdata
{
        char SessionID[4];
        char StudentID[9];
        char EndByte;
        char data[32];                        // should add '\n' at the end
} clientdata;
...

SessionID没有尾0!

论坛徽章:
0
7 [报告]
发表于 2009-11-10 18:38 |只看该作者

回复 #3 vime000 的帖子

不会吧
我再确认下

论坛徽章:
0
8 [报告]
发表于 2009-11-10 18:39 |只看该作者

回复 #3 vime000 的帖子

不会吧
我再确认下

论坛徽章:
0
9 [报告]
发表于 2009-11-10 19:08 |只看该作者
该不是用printf打印的吧?如果这代码是楼主写的,楼主的C语言还得好好学学才是啊!

论坛徽章:
0
10 [报告]
发表于 2009-11-10 19:51 |只看该作者
不要听楼上的,拷贝结构体到内存不常用,一般的c程序员连分配一块结构体内存都得用公司现有接口。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP