请教如何实现struct和char的互相转换?

wzzhu820429 2005-01-18 11:03:00
在socket编程过程中,client端希望放入socket的是一个自己定义的struct,server端希望把socket里面的struct取出。但是遇到了类型转换的问题,诚心请教大家,代码大意如下:

struct dms_tcp_msg{
int header[4];
char *data;
};

dms_tcp_msg *msg;
msg=(dms_tcp_msg *)malloc(sizeof(msg));

char *buffer;
buffer=(char *)malloc(sizeof(MAXDATASIZE));
buffer=(dms_tcp_msg *)msg;

printf("msg->data=%s\n",msg->data);

打印出来的结果为空。

应该是转换的过程有问题,但是一下子又不知道是错在了哪里。

刚刚开始做socket的编程,有些概念也很不清楚,比如放入socket, 和从socket中取出的结构是否一定要是char * 呢?
...全文
472 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
KyoKouYi 2005-01-21
  • 打赏
  • 举报
回复
struct dms_tcp_msg{
int header[4];
char *data;
};
// 第一个错误:
dms_tcp_msg *msg;
msg=(dms_tcp_msg *)malloc(sizeof(msg)); // sizeof(msg) = sizeof(long),这里应该是sizeof(dms_tcp_msg)


//第二个错误:
char *buffer;
buffer=(char *)malloc(sizeof(MAXDATASIZE));
buffer=(dms_tcp_msg *)msg;
这个错误比较复杂,看你的意思是想把msg的内容赋值给buffer,如果是这样的话,应该用memcpy((void *)&buffer, (void *)msg, sizeof(dms_tcp_msg))或者strcpy
如果是单纯的指针操作的话,应该用
char *buffer;
buffer=(char *)msg;

printf("msg->data=%s\n",msg->data);
somedummy 2005-01-21
  • 打赏
  • 举报
回复
难道0指针还不是原则问题?要知道,和读写0指针比起来,有效长度根本算不上什么问题
netsbull 2005-01-20
  • 打赏
  • 举报
回复
倒,居然生气:)
有指针没长度是原则问题,看到随口说说而已。
netsbull 2005-01-19
  • 打赏
  • 举报
回复
To somedummy(某人马甲),
strcpy(buf+sizeof(int)*4,msg->data);
这个有问题,data一定是string?未必。如果header里面没有包含data长度,就要在struct定义data的长度。指针data本身不可能确定其长度。然后用memcpy好了。
CMyMfc 2005-01-19
  • 打赏
  • 举报
回复
两位不要争了, 和气为贵
somedummy 2005-01-19
  • 打赏
  • 举报
回复
回复人: netsbull(网牛) ( ) 信誉:100 2005-01-19 00:35:00 得分: 0


To somedummy(某人马甲),
strcpy(buf+sizeof(int)*4,msg->data);
这个有问题,data一定是string?未必。如果header里面没有包含data长度,就要在struct定义data的长度。指针data本身不可能确定其长度。然后用memcpy好了。
========================================================
再说了,如果要谈错误的话,更严重的也不是你说的这个,而是data指针的有效性问题,我连它是否为NULL都没有检查,这才明显是更严重的错误

somedummy 2005-01-19
  • 打赏
  • 举报
回复
回复人: netsbull(网牛) ( ) 信誉:100 2005-01-19 00:35:00 得分: 0


To somedummy(某人马甲),
strcpy(buf+sizeof(int)*4,msg->data);
这个有问题,data一定是string?未必。如果header里面没有包含data长度,就要在struct定义data的长度。指针data本身不可能确定其长度。然后用memcpy好了。


=================================
知道什么叫吹毛求疵吗?再说了,示例就一定等于最终代码?
bjgxjob 2005-01-19
  • 打赏
  • 举报
回复
beyondtkl(大龙驹<*百善孝为先*>)提供的方法是MS的习惯,比较好,推荐。
nicknide 2005-01-19
  • 打赏
  • 举报
回复
楼主,我在JAVA上写了个打包数据的类,如果需要的话,可以发给你……呵呵

C++上的也是同样原理,不过没有时间写了,呵呵
beyondtkl 2005-01-19
  • 打赏
  • 举报
回复
struct dms_tcp_msg{
int header[4];
char *data;
};

--->
struct dms_tcp_msg{
int header[4];
int nDataLen;
char szData[1];
};

dms_tcp_msg msg;
msg.szData = new char[100];
msg.nDataLen = 100;
這樣你就按照長度直接讀取就是 不用擔心 也可以直接轉換。。
char* 也可以 但是 要記得char*指向得地址跟本身結構體不一定是相連接地。。。

stevens2009 2005-01-19
  • 打赏
  • 举报
回复
用 memcpy().
somedummy 2005-01-18
  • 打赏
  • 举报
回复
另外,你原来的代码还有内存泄漏,我上面的代码只是构造缓冲区的示例,最后不要忘记free(buf);
somedummy 2005-01-18
  • 打赏
  • 举报
回复
重组
char* buf=malloc(sizeof(int)*4+strlen(msg->data)+1);
memcpy(buf,msg,sizeof(int)*4);
strcpy(buf+sizeof(int)*4,msg->data);
然后send(s,buf,sizeof(int)*4+strlen(msg->data),0);
这样就会发送正确的数据了
CMyMfc 2005-01-18
  • 打赏
  • 举报
回复
如果你的data是定长的可以考虑放在一个数组里边

struct dms_tcp_msg{
int header[4];
char data[512];
};


还有你上边的
char *buffer;
buffer=(char *)malloc(sizeof(MAXDATASIZE)); // MAXDATASIZE怎么还用sizeof()????
buffer=(dms_tcp_msg *)msg;
~~~~~~~~~~~~~~~~~~~~~~~~~
怎么刚给buffer分配内存,就又把指针指向别处?
如果你想把msg中的值给buffer的话应该
memcpy(buffer, msg, MAXDATASIZE);
wzzhu820429 2005-01-18
  • 打赏
  • 举报
回复
哦,怪不得我单独传data的时候就是可以的,整个struct就不行。

那么是否是说如果要传一个struct,就一定要把每一项都分开来传。没有其他的方法了么?

socket数据的传输是stream的方式,如果在client把struct的内容放入socket,server端在把这个内容取出来,这个应该可以实现的吧。
somedummy 2005-01-18
  • 打赏
  • 举报
回复
上次在VC.Net遇到一个直接传递的struct里面放了CString的,也和楼主犯了一样的错误
somedummy 2005-01-18
  • 打赏
  • 举报
回复
这个显然错误啊!

指针成员传递到其他的计算机上可以说一点用处都没有的!

你要把这两个东西分开来传输(重组也一样),或者把data的类型换成char[]还差不多。

64,648

社区成员

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

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