类型转换的问题请教,知道一点的都可以回答。不断加分

kiko_lee 2001-07-30 05:47:32
我用socket发送的的buf中间需要的是 char *类型的数据,我想将一个 struct 直接转换成 char * 发过去。
我用
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
buf = (char *)calloc(1,sizeof(ABCD));
///
给abcd 中间赋值,其中有多个char[]的值和int 的值
///
memcpy(buf,abcd,sizeof(ABCD));
//strcpy(buf,(char *)abcd);也不可以
sock(host,buf,....);
//sock(host,(char *)buf,...);也不可以

问题就是在这里,这个buf中间的值总是不对,大家知道为什么否。
...全文
162 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiko_lee 2001-08-07
  • 打赏
  • 举报
回复
不管了,给分,大家都有不少的建议呢。
ydogg 2001-08-03
  • 打赏
  • 举报
回复
memcpy不copy最后的'\0'...
kiko_lee 2001-08-03
  • 打赏
  • 举报
回复
我发现将char * memcpy 到 char * 中间都有点问题,但是如果放到 char []中间就可以了,大家知道为什么否?
zhangnanonnet 2001-08-03
  • 打赏
  • 举报
回复
你试试把类型变为BYTE
mc_music 2001-08-03
  • 打赏
  • 举报
回复
请注意我的程序:
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
//初始化abcd
buf=abcd;//指针直接符值就可以了
wenjiu5 2001-08-03
  • 打赏
  • 举报
回复
是你看错了
因为char*是以0 结尾的
kiko_lee 2001-07-31
  • 打赏
  • 举报
回复
我按照楼上的兄弟说的,做了一下,但是仍然做不下来,我用
memcpy(buf,abcd,sizeof(ABCD));
中间的abcd,不知道是不是地址的问题。
lz_0618 2001-07-31
  • 打赏
  • 举报
回复
根本不是什么字节对齐的问题,我上面的程序经过测试都好用啊,这位老兄用我的那段程序究竟是什么错误,能说清楚点吗???

我这边用socket发送结构是一点问题也没有啊,而且是在VC和Delphi编的程序间通讯,当然,这时应该注意字节对齐的问题了,在VC程序间,只要不是故意将服务器和客户端的编译环境设的不一样,肯定是没有什么问题的,最多是多传几个Bit罢了。
mydewang 2001-07-31
  • 打赏
  • 举报
回复
其实这里是一个字节对齐的问题,
比如
struct AA
{
int a;
char b;
};
那么sizeof( struct AA )就不等于5了,而是8了,所以,将这个结构赋值给一个char *,里面会多出一些零...

需要解决这个问题,可以在Project->Setting->Link->Project Options里加上/Zp1

另外,可以参考一下MSDN里/Zp的编译选项.....
lvfengxun 2001-07-31
  • 打赏
  • 举报
回复
直接将结构指针作为send的参数发就可以了,还用转换什么
有必要在这里讨论吗?
struct AA
{
int a;
char b[100];
};
struct AA aa;
aa.a=11;
strcpy(aa.b,"aaa");
send(hSocket,(char *)(&aa),sizeof(aa),0);
//OK
eggplant 2001-07-31
  • 打赏
  • 举报
回复
最好使用memcpy(),因为struct中的值有可能包含零字节,所以strcpy()可能不对,如果传递struct,最好把struct的字节对齐改为以字节为单位。
zb_china 2001-07-31
  • 打赏
  • 举报
回复
看不明白
IamNotMan 2001-07-31
  • 打赏
  • 举报
回复
我常这么用
ABCD a ;
//给a的各个域赋值(一定不能含有指针项)
char* buff = new char[sizeof(ABCD)];
memcpy(buff,&a,sizeof(ABCD));
//或者 *(ABCD*)buff = a;
.................
如果buff里的数对,说明问题不在这儿吧
ydogg 2001-07-31
  • 打赏
  • 举报
回复
只能传递流数据,结构是传递不过去的。
supersusheng 2001-07-31
  • 打赏
  • 举报
回复
老大,你sizeof()得出的数值事多大,看看吧。
lz_0618 2001-07-30
  • 打赏
  • 举报
回复
你用的VC???改成ABCD *abcd;后编译一点问题也没有啊!
sock(host,buf,....);这不知是什么,自定义函数?

typedef struct _ABCD
{
int ID;
char Name[10];
}ABCD;

.......


ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(2,sizeof(ABCD));
buf = (char *)calloc(2,sizeof(ABCD));
///
//给abcd 中间赋值,其中有多个char[]的值和int 的值
abcd[0].ID =1;
abcd[1].ID =2;
///
memcpy(buf,abcd,2*sizeof(ABCD));
strcpy(buf,(char *)abcd);//也不可以

buf中的内容也正确!!
kiko_lee 2001-07-30
  • 打赏
  • 举报
回复
但是用memcpy这个是将整个数据都复制过去
wolf721 2001-07-30
  • 打赏
  • 举报
回复
你传的是个指针值,而不是数据

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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