怎么用数组给结构体赋值

结构体如下:
typedef struct event
{
short head[3];
short ADC1H;
short ADC1[16];
}eve,里面都是short型的数组或者数值,现在想把一个数组,如short a[80],按照顺序直接赋值给结构体eve,把80个数据用循环方法赋值4次,请问怎么实现?下面的方法好像不行
int j=0;
for(int i=0;i<4;++i)
{ memcpy(eve,a[j],20);
j+=20;
.....
}

eve arr[4];
short a[80];
对于这样的数据,
if (sizeof(a) == sizeof(arr))
memcpy(arr, a, sizeof(arr));
else
//输出一些出错信息
就可以了。所有成员加起来是20个short的情况是对齐的。
顺便如果那个地方要输出出错信息,那么是编译期就决定要不要输出的,而不是运行期。
如果4和80这个数字是可变的,那么要自己计算大小,不能用 sizeof(指针) 去获取一个数组的大小
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-05
由于存在对齐 所以直接memcpy不行
可以这样
int i, j;
for(i = 0, j = 0; i < 4; i ++, j += 20)
{
memcpy(&eve.head, &a[j], sizeof eve.head);

eve.ADC1H=a[j+3];

memcpy(eve.ADC1, &a[j+4], sizeof eve.ADC1);

}

或者设置成字节对齐,然后直接memcpy 不过不好,会影响eve的访问效率追问

请问这样分组复制就不存在对齐的问题了吗?因为这样也有数组复制到数组的问题。还有就是那个结构体会经常变动,所以想一次性的复制进去,而不想这样子分部分的复制。这样子就不用每次改很多代码了

追答

结构体内部数组的内存肯定是连续的
但是结构体内部各个元素之间不一定是连续的
如果想一次性复制进去,同时不想改动对齐方式的话,可以先计算出各个元素之间的相对位置
然后对a进行处理 添加一些空白元素进去,最后对eve赋值
比如你这个结构体
如果按默认对齐方式 在32位机上(4字节对齐)
typedef struct event
{
short head[3];
short ADC1H;
short ADC1[16];
}eve
head和ADC1H之间会有2字节空白,ADC1H和ADC1之间也有2字节空白

这个你可以把地址打印出来验证一下(PS:sizeof eve应该是44)
如果是这样的话,可以在数组a中,以20元素为一组,扩充到22元素,分别在a[3]加一个空白元素,a[5]处加一个空白元素
这样直接memcpy应该就可以了

本回答被提问者采纳
相似回答