怎么用数组给结构体赋值

结构体如下:typedefstructevent{shorthead[3];shortADC1H;shortADC1[16];}eve,里面都是short型的数组或者数值... 结构体如下:
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;
.....
}
展开
 我来答
空雪梦见
2013-11-29 · TA获得超过5598个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1220万
展开全部
eve arr[4];
short a[80];
对于这样的数据,
if (sizeof(a) == sizeof(arr))
memcpy(arr, a, sizeof(arr));
else
//输出一些出错信息
就可以了。所有成员加起来是20个short的情况是对齐的。
顺便如果那个地方要输出出错信息,那么是编译期就决定要不要输出的,而不是运行期。
如果4和80这个数字是可变的,那么要自己计算大小,不能用 sizeof(指针) 去获取一个数组的大小
风若远去何人留
推荐于2017-10-05 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450135
专业C/C++软件开发

向TA提问 私信TA
展开全部
由于存在对齐 所以直接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应该就可以了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式