现象:现有三个结构体,分别是结构体A,结构体B,结构体C。三者之间的关系为结构体C中元素包含了结构体A和结构体B。见下:
struct A
{
int num;
char p[4];
};
struct B
{
int filesize;
int filenum;
};
struct C
{
int num;
char p[4];
int filesize;
int filenum;
};
在将结构体A和结构体B拷贝到结构体C中出现的问题,直接上源码:
#include <string.h>
struct A
{
int num;
char p[4];
};
struct B
{
int filesize;
int filenum;
};
struct C
{
int num;
char p[4];
int filesize;
int filenum;
};
int main()
{
A a = {5,"abc"};
B b = {100,3};
C c = {0,NULL,0,0};
memcpy(&c,&a,sizeof(a));
memcpy(&c + sizeof(a),&b,sizeof(b)); //错误
memset(&c,0,sizeof(c));
memcpy((char *)&c,&a,sizeof(a));
memcpy((char *)&c + sizeof(a),&b,sizeof(b)); //正确
return 0;
}
上面,当运行到memcpy(&c + sizeof(a),&b,sizeof(b));时会发现,结构体b并没有被拷贝进结构体c中,查看结构体c的内存信息可以看到,结构体b的信息被拷贝到了另外一个地方去了
原因是因为在进行结构体移动拷贝的时候在进行移动的时候,是按照移动单元的方式来进行移动的,上面memcpy(&c + sizeof(a),&b,sizeof(b));相当于是往结果体c后面移动了sizeof(a)*sizeof(c)的长度,所以出现了拷贝出错的问题。