你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教一个C语言结构体的赋值问题。

[复制链接]
vention123456 提问时间:2017-10-18 20:57 /
悬赏10ST金币已解决
本帖最后由 vention123456 于 2017-10-18 20:59 编辑

请问,我有结构体 两个结构体,如何将快速的赋值过去。

typedef struct
{
        unsigned char    A1[150];        
        unsigned char    A2[100];        
        unsigned long int   A3[200];
        unsigned short int   A4[100];
        unsigned long int   A5[300];
}ST_ONE;



typedef struct
{
        unsigned char    A1[150];        
        unsigned char    A2[100];        
        unsigned long int   A3[200];
        unsigned long int   A3_0[100];    //  增加一个成员A3_0
        unsigned short int   A4[100];
        unsigned long int   A5[300];
}ST_TWO;


ST_ONE    stOne;
ST_TWO   stTwo;
请问,有什么办法,使得stOne,和stTwo 两个结构体,相同的成员名赋值为一样的,而结构体stTwo多出来的 一个成员A3_0,我可以再另行赋值。
是否可以用共同体?这样使得stOne结构体 在一赋值的时候, stTwo结构体内相同成员名的成员就已经赋值了?如果用共同体的话,要如何实现?;还是说有其他好的方法。麻烦各位大神指点指点小弟。

最佳答案

查看完整内容

union 其实就是占用同一块内存,在共用体里边定义一个与结构体等长的char数组,数组里边每个字节对应结构体从上到下的字节。按照结构体里边每个元素的字节数从stOne赋值值stTwo。
收藏 评论14 发布时间:2017-10-18 20:57

举报

14个回答
张亚飞 回答时间:2017-10-18 20:57:35
vention123456 发表于 2017-10-19 18:25
问题就是不能把多出的放最下面;多出的是中间插入的。

union 其实就是占用同一块内存,在共用体里边定义一个与结构体等长的char数组,数组里边每个字节对应结构体从上到下的字节。按照结构体里边每个元素的字节数从stOne赋值值stTwo。
wenyangzeng 回答时间:2017-10-18 21:31:02
for(i=0;i<150;i++){
stOne.A1[i]= stTwo.A1[i]=0x00;
}
............
uzslm 回答时间:2017-10-18 22:43:40

C 语言可不支持这样的连续操作
uzslm 回答时间:2017-10-18 22:46:41
union 是个很好的办法,但你多出来那个成员最好在底部;
而且这涉及到成员对齐问题,可以看看用 pack预编译指令能否解决。
uzslm 回答时间:2017-10-18 23:02:34
示例:
union
{
typedef struct
{
        unsigned char    A1[150];        
        unsigned char    A2[100];        
        unsigned long int   A3[200];
        unsigned short int   A4[100];
        unsigned long int   A5[300];
}ST_ONE;
typedef struct
{
        unsigned char    A1[150];        
        unsigned char    A2[100];        
        unsigned long int   A3[200];
        unsigned long int   A3_0[100];    //  增加一个成员A3_0
        unsigned short int   A4[100];
        unsigned long int   A5[300];
}ST_TWO;
}
但应该把TWO的那个多出来的放在底部,这样你对TWO进行初始化后,ONE就跟着一样了;记住他们在内存里是共享一个存贮单元的,你修改了其中任何一个,另外一个也跟着一样修改了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

harvardx 回答时间:2017-10-19 05:53:44
可以自己在mdk里面写代码测试 ,在线调试 ,就知道结果

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zhoupxa 回答时间:2017-10-19 09:11:01
同意uzslm
zhao.zhao 回答时间:2017-10-19 12:39:00
用联合体union, 不过长度要设为等长,位置要相对应起来,这样给一个变量赋了值,另一个也得到了相同的值

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

uzslm 回答时间:2017-10-19 13:52:44
就这个case来说,不一定非要等长;基本原则来说就是按照顺序,变量类型要一致
张亚飞 回答时间:2017-10-19 14:32:52
先一字节对齐,把新增的放在最下边,memcpy
vention123456 回答时间:2017-10-19 18:25:03
张亚飞 发表于 2017-10-19 14:32
先一字节对齐,把新增的放在最下边,memcpy

问题就是不能把多出的放最下面;多出的是中间插入的。
vention123456 回答时间:2017-10-19 18:25:46
uzslm 发表于 2017-10-18 22:46
union 是个很好的办法,但你多出来那个成员最好在底部;
而且这涉及到成员对齐问题,可以看看用 pack预编译 ...

问题就是不能把多出的放最下面;多出的是中间插入的。
张亚飞 回答时间:2017-10-20 09:47:20
vention123456 发表于 2017-10-19 18:25
问题就是不能把多出的放最下面;多出的是中间插入的。

union 其实就是占用同一块内存,在共用体里边定义一个与结构体等长的char数组,数组里边每个字节对应结构体从上到下的字节。按照结构体里边每个元素的字节数从stOne赋值值stTwo。
owenqll 回答时间:2017-10-20 11:26:46
个人觉得可以用指针强制类型转换,大致思路如下
先定义两个结构体指针,分别指向两个结构体的首地址;
再强制将两个指针转换为uint8类型
用for循环逐个读取并幅值
=========
个人愚见,勿拍砖

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版