如何拷贝一个结构?

liuhaochuan 2002-12-30 03:16:24
比如说我有一个结构,结构中的成员可能是其他的结构,我如何才能得到一个和该结构一模一样的拷贝?递归吗? 有没有哪位同学有现成的代码啊~~~

typedef struct _WSAOVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
WSAEVENT hEvent;
} WSAOVERLAPPED, *LPWSAOVERLAPPED;

分不够偶再加。
...全文
50 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluck10660 2003-01-03
  • 打赏
  • 举报
回复
重载operator=
liu_feng_fly 2003-01-03
  • 打赏
  • 举报
回复
有了CString std::string这些类,只会使处理字符串越来越简单。当然,如果你非要抛弃这些类,使用更复杂容易出错的方法也可以,除非必须那样,否则就只有事倍功半的效果了。
wolfghost 2003-01-03
  • 打赏
  • 举报
回复
但是,如果是MFC自己的结构呢
比如BITMAP那里面的字符串呢回是CString 类型的吗
liu_feng_fly 2003-01-03
  • 打赏
  • 举报
回复
不用char testBuf[10];使用CString 或者std::string来描述字符串,这样,你这个结构用编译器默认合成的operator =和拷贝构造函数也就够了。
wolfghost 2003-01-03
  • 打赏
  • 举报
回复
我现在有一个结构体变量的数据:
struct TESTSTRUCTURE
{
char testBuf[10];
int testInt;
long testLong;

};//长度是20个字节 用它定义了一个变量test 也已经赋值了
我现在用char*buf=new char[30];
memcpy(buf,&test,20);
现在数据是进入buf了
但是int 和long 有 '\0'在里面呀
现在要用CString str=buf;//因为还要和其他的数据合并
但现在的问题是 str把原来是int数据的一部分的'\0'当成了字符串的结束符
这样进入str 的数据就不对了
请问这个问题怎么来解决呢
Davidzhuhua 2003-01-03
  • 打赏
  • 举报
回复
我想应用结构直接赋值( StructA =StructB )就可以实现复制。
justlearning 2003-01-03
  • 打赏
  • 举报
回复
一直都是直接用“=”呀
heartthrob 2003-01-03
  • 打赏
  • 举报
回复
我现在有一个结构体变量的数据:
struct TESTSTRUCTURE
{
char testBuf[10];
int testInt;
long testLong;

};//长度是20个字节 用它定义了一个变量test 也已经赋值了
我现在用char*buf=new char[30];
memcpy(buf,&test,20);
现在数据是进入buf了
但是int 和long 有 '\0'在里面呀
现在要用CString str=buf;//因为还要和其他的数据合并
但现在的问题是 str把原来是int数据的一部分的'\0'当成了字符串的结束符
这样进入str 的数据就不对了
请问这个问题怎么来解决呢
------------------------------
这样的数据当然不对,字符串遇到'\0'就自动停止了。你可以这样:
vetctor<BYTE> *vByte = new vector<BYTE>;
memcpy(buf,&test,sizeof(TESTSTRUCTURE));//注意:这里不能用20代替sizeof,因为它并不一定等于20!
现在所有的数据应该都在vByte里面了!

everandforever 2003-01-03
  • 打赏
  • 举报
回复
数据对齐问题呢?

建议用"="
wolfghost 2003-01-03
  • 打赏
  • 举报
回复
不,问题的关键不在字符串上面
而是在结构体里的int 上
int 有四个字节 如果是int i=20;
那将会有三个字节是'\0' 这样的
将这样的结构体变量放到字符型的缓冲区里
本来是作为int型数据的一部分现在却变成了字符串的结束标记了
那后面的数据就会丢失了 不是吗
现在要怎么解决这个问题呢

heartthrob 2002-12-30
  • 打赏
  • 举报
回复
如果 我想把这个结构体转换成这样行吗
WSAOVERLAPPED test;
//init test
long n=sizeof(WSAOVERLAPPED);
char* buf=new char[n+1];
memcpy(buf,(char*)&test,n);
buf[n]='\0';
结果buf字符串里面是空的
请问这是怎么回事啊

--------------------------------
检验是不是真的为空:
1.先初始化buf全为0
ZeroMemory(buf,n+1);

2.现在buf真的是全空吗?你把它的字符用int类型打印出来看看
for(int i = 0;i<n;i++)
{
print("%d",buf[i]);
}
看是不是全是0.如果不是全为0,说明拷贝应该成功了。
liu_feng_fly 2002-12-30
  • 打赏
  • 举报
回复
如果有必要写拷贝构造函数和operator = ,否则一般使用编译器合成的就够了
Cline 2002-12-30
  • 打赏
  • 举报
回复
If the structure has no member that is a pointer,assignment is OK;

WSAOVERLAPPED testA;
...
WSAOVERLAPPED testB;

testB=testA;





liuhaochuan 2002-12-30
  • 打赏
  • 举报
回复
test只是被初试化乐,但它的成员都没有赋值 所以是空的
wolfghost 2002-12-30
  • 打赏
  • 举报
回复
如果 我想把这个结构体转换成这样行吗
WSAOVERLAPPED test;
//init test
long n=sizeof(WSAOVERLAPPED);
char* buf=new char[n+1];
memcpy(buf,(char*)&test,n);
buf[n]='\0';
结果buf字符串里面是空的
请问这是怎么回事啊
liuhaochuan 2002-12-30
  • 打赏
  • 举报
回复
慢。。。如何这个结构里有成员是指针的话,那拷贝出来的结构里该成员指针地址和源结构中成员的地址是否一样呢?
liuhaochuan 2002-12-30
  • 打赏
  • 举报
回复
谢谢!揭贴
liuhaochuan 2002-12-30
  • 打赏
  • 举报
回复
RE:bljbljbljblj(LPTSTR)(LPCTSTR)
如何才知道填充大小?
bljbljbljblj 2002-12-30
  • 打赏
  • 举报
回复
WSAOVERLAPPED test;
//init test
...

WSAOVERLAPPED *pTest =new WSAOVERLAPPED;
memcpy(pTest,&test,sizeof(WSAOVERLAPPED));
bljbljbljblj 2002-12-30
  • 打赏
  • 举报
回复
memcpy(要被替填充的结构的指针,要替填充的结构的指针,填充大小)
加载更多回复(3)

16,472

社区成员

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

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

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