C语言,结构体用数组memcpy的问题

定义结构体
struct aaa
{
char sz1[5];

char sz2[10];

};
struct bbb
{
char sz1[5];

char sz2[10];

char c1;

};
定义一个数组:char szBuf[100];

问题:
假设szBuf[0]~szBuf[4]存放的是我要赋给结构体aaa中的sz1的数据,szBuf[5]~szBuf[14]存放的是我要赋值给aaa中sz2的数据,那么我可以用memcpy(&aaa, szBuf, sizeof(struct aaa))吗???

又假设zBuf[0]~szBuf[4]存放的是我要赋给结构体bbb中的sz1的数据,szBuf[5]~szBuf[14]存放的是我要赋值给bbb中sz2的数据,szBuf[15] = ‘0‘存放的是要给bbb中c1的,那么我可以用memcpy(&bbb, szBuf, sizeof(struct bbb))吗???

这个问题一直困扰我,请大神解答一下,急~~

可以,如果结构体中全是char型数据一点问题都没有

但如果结构体内有其他类型的数据,就有问题了,因为会涉及到内存对齐问题

你要弄清楚这个概念,你需要清楚的知道80X86CPU的内存对齐规则(对齐其实是编译器规定的,但是为了CPU高效访问内存,编译器一般都会按照CPU 的规则去对齐)

如果你没指定#pragma pack
那么32位windows下的编译器默认是4字节对齐的

具体怎么对齐的比较复杂,自己参考别的资料吧。。

我只想说,如果 结构体内全身char型的,你尽管用你的方法去做好了,一点问题都没有追问

只要都是char型就都可以吗,不管是char数组还是char字符,是吗?

追答

是的,只要是x86下的C编译器,都可以,单片机上我就不知道了
X86下的 你不需要指定#pragma pack 里面如果都是char类型的,无论数组与否(一个数组就相当于多个char)都是紧密连着的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-31
和编译器有关,一般不推荐这样做
结构体成员之间在内存空间不一定是连续的,其中间可能包含内存对齐空间以提高CPU的访问效率
第2个回答  2013-08-31
应该对结构内的成员一个个单独操作,写质量高的代码。也许你在某个环境下测试通过,但是给程序留下了隐患 。
第3个回答  2013-08-31
可能会有对齐的问题,在代码里加上#pragma pack (1)
相似回答