求教,,,关于结构体中的指针~~~~~~~~~~~~~~~~~~~~~~~~~~~~

taoyi 2005-10-14 11:55:14
有这样一个结构:

typedef struct _pck
{
int size;
char *header;
char *body;
}PCK

如果我需要将上面的内容复制到一个缓冲,该怎么做最好?

如下:
PCK pck;
char *buf = new char[pck.size];
memcpy(buf, ...........);

直接拷贝肯定是不行的,可这里需要怎么样将该结构体中的数据全部拷贝到BUF缓冲区呢??就像没有指针的结构体一样拷贝

...全文
305 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjunxu 2005-10-14
  • 打赏
  • 举报
回复
int size;是什么东西的size ?
看上去是memcpy( dst, pck, pck.size ) 就好了。
Jarrylogin 2005-10-14
  • 打赏
  • 举报
回复
看看C++的深复制和浅复制的概念
vcmute 2005-10-14
  • 打赏
  • 举报
回复
深度拷贝?如
memcpy(pck2,pck,sizeof(PCK));
pck2.header = strdup(pck.header);
pck2.body= strdup(pck.body);
pomelowu 2005-10-14
  • 打赏
  • 举报
回复
memcpy(buf, pck.header, strlen(pck.header));
memcpy(buf + strlen(pck.header), pck.body, strlen(pck.body));

上面的方法没有copy字符串结束的'\0'
pomelowu 2005-10-14
  • 打赏
  • 举报
回复
- -!
goodluckyxl 2005-10-14
  • 打赏
  • 举报
回复
纠正 战士一个错误
CK *pPck = (PCK *)new char(sizeof(PCK) + sizeheader + sizebody);
//这是分配一个字符并初始化 []才是正道
//哈哈快去散分给我
hjunxu 2005-10-14
  • 打赏
  • 举报
回复
按我说的办法可以相对灵活些,比如,知道了sizeheader,sizebody,计算出总的需要的空间,然后

PCK *pPck = (PCK *)new char(sizeof(PCK) + sizeheader + sizebody);
pPck->header = pPck->buffer;
pPck->body = pPck->header + sizeheader;
===============================================
是的,没错,要写的话我也可能会照你的方法写的。
我只是把它变的比较容易理解一些。
hjunxu 2005-10-14
  • 打赏
  • 举报
回复
哦,呵呵。
因为正好CRT也有CHAR_MAX这个宏的,所以没有明白。
pomelowu 2005-10-14
  • 打赏
  • 举报
回复
按我说的办法可以相对灵活些,比如,知道了sizeheader,sizebody,计算出总的需要的空间,然后

PCK *pPck = (PCK *)new char(sizeof(PCK) + sizeheader + sizebody);
pPck->header = pPck->buffer;
pPck->body = pPck->header + sizeheader;
//...

^^
pomelowu 2005-10-14
  • 打赏
  • 举报
回复
呵呵,手误啊
PCK *pPck = (PCK *)new char(sizeof(PCK) + CHAR_MAX);
CHAR_MAX就是我说的,buffer的大小。
hjunxu 2005-10-14
  • 打赏
  • 举报
回复
typedef struct _pck
{
char* header;
char* body;
char* ...;
char buffer[MAX_SIZE];
}PCK;
PCK pPck = new BYTE[sizeof(PCK)];
pPck->header = &buffer[0];
pPck->body = &buffer[HEADERSIZE];

这样写会不会好理解一些。
hjunxu 2005-10-14
  • 打赏
  • 举报
回复
汗!

PCK pPck = new (sizeof (PCK) + CHAR_MAX);
是什么?
加上CHAR_MAX是什么意思 ?
hxzb7215191 2005-10-14
  • 打赏
  • 举报
回复
结构体里的一个指针你可以把它完全看成为一个无符号的int.
它自己只是一个地址,用于保存一个内存地址的东西.
没有保存内容的能力.要自己新建内存空间才行.
goodluckyxl 2005-10-14
  • 打赏
  • 举报
回复
哈哈 从战士身上看到一股霸气
pomelowu 2005-10-14
  • 打赏
  • 举报
回复
寒~
PCK pPck = new (sizeof (PCK) + CHAR_MAX);
随手写的,献丑了- -#

正好跟狗狗想得一样。
pomelowu 2005-10-14
  • 打赏
  • 举报
回复
用指针数组吧,循环的话方便一点。
另,int和char *不要分开声明,这样管理起来方便。
再,如果能确定所有的字符串的上限,甚至可以这样做:
typedef struct _pck
{
int sizeheader; //size
int sizebody; //这个是写掉了的,SORRY~
int ...;
char *...; // 或者是指针数组
char buffer[]; //here
}PCK;
这样PCK pPck = new (sizeof (PCK) + CHAR_MAX);
以后把字符数据都放到buffer中,前面的指针(数组)只需要按*size在buffer中做偏移。

To hjunxu(hjun),我误会了你的意思,抱歉。
goodluckyxl 2005-10-14
  • 打赏
  • 举报
回复
在结构分配空间的时候
由自己申请空间开辟
类似于
placement new操作
将你的head body等指针整合成一个来逻辑上连续的地址
拷贝时提供首地址拷贝总长
hjunxu 2005-10-14
  • 打赏
  • 举报
回复
难得来,再扯两句。

按照你定义的字面意思来看,这些内存看上去是连续的(header,body),我想如果你真是做什么数据传送的报文的话,strlen(header)+strlen(body)这个做法显然不怎么恰当,首先不一定是字符串,在则,连续的内存显然比较容易做send这样的操作,拷贝也方便。
反过来说如果不是连续的话,只有一个个的考。

taoyi 2005-10-14
  • 打赏
  • 举报
回复
char* 有拿指针做偏移的么
按结构名字来考虑偏移也应该是 unsigned int headoffset or bodyoffset
size 应该是 总报文的长度strlen(header)+strlen(body)

像 goodluckyxl这样理解也是可以的,不影响这个问题的关键,就是如何将这些指针所指的内容完全挨个地拷贝到缓冲区??
taoyi 2005-10-14
  • 打赏
  • 举报
回复
不好意思,,这里是我没说明白
这里的size是指指针所指偏移的大小,因为我想问这个问题的关键在于结构体中有多个指针时,如何将它的内容(成员和指针所指的内容)完整地拷贝到一个缓冲区,所以一时没注意就只写了一个size,这个size指的是指针所指的内容的大小.
引用hjunxu(hjun) 的
typedef struct _pck
{
int sizeheader; //size
char *header;
int sizebody; //这个是写掉了的,SORRY~
char *body;
int ...;
char *...;
}PCK;

在这种时候如何拷贝到缓冲区?? 一个个的拷贝太麻烦了~
加载更多回复(9)

16,472

社区成员

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

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

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