C 联合复制内存
C Union to copy memory
我有以下遗留代码:
#define UINT8 unsigned char
#define UINT16 unsigned short
#define UINT32 unsigned long
typedef union
{
struct
{
UINT16 R1: 1;
UINT16 S1: 1;
UINT16 S2: 1;
UINT16 D1: 1;
UINT16 I1: 1;
UINT16 S3: 1;
UINT16 S4: 1;
UINT16 S5: 1;
UINT16 S6: 1;
UINT16 P1: 1;
UINT16 F1: 1;
UINT16 I2: 1;
UINT16 R2: 4;
}bb;
UINT16 V16;
}test_union11;
typedef struct /* memory index */
{ /* ++++++++++++ */
// Write Config 01-32
UINT16 i1; /* 0 */
UINT16 i2; /* 2 */
// Faults
UINT16 o3; /* 4 */
UINT16 o4; /* 6 */
UINT16 o5; /* 8 */
UINT16 o6; /* 10 */
// Values 01-08
UINT8 o7; /* 12 */
UINT8 o8; /* 13 */
UINT8 o9; /* 14 */
UINT8 o10; /* 15 */
UINT8 o11; /* 16 */
UINT8 o12; /* 17 */
UINT8 o13; /* 18 */
UINT8 o14; /* 19 */
// Values 09-12
UINT16 o15; /* 20 */
UINT16 o16; /* 22 */
UINT16 o17; /* 24 */
UINT16 o18; /* 26 */
// Values 13-14
UINT32 o19; /* 28 */
UINT32 o20; /* 32 */
UINT8 OctStr[8];
} test_str11;
test_str11 test_str1;
test_union11 test_union;
int test_memcpy(void) {
test_str1.o15 = 1500;
test_union.V16 = test_str1.i1;
memcpy(&test_union,&test_str1,sizeof(test_union11));
}
int main(void) {
test_memcpy();
printf("Test Pass!\n");
return 0;
}
test_union.V16 = test_str1.i1
行背后的想法是 test_union.bb 嵌套结构由结构 "test_str1" 中的数据填充吗?但是由于某种原因,既不是在那条线之后,也不是发生在 memcpy 之后。为什么?而union内部嵌套结构中的数字又是什么意思呢?
我测试了这种情况,当没有这样的数字具有更小的联合和结构并且 memcpy 成功时,尽管第一个元素分配的技巧没有成功。但是这样的语法:
un = (*(test_union1*)&st);
第二次测试也成功了,但没有提供代码。这两个表达有什么区别? test_union.V16 = test_str1.i1
是仅复制 i1 变量还是复制 test_union.bb 可以容纳的字节数?
该代码应该可以在 stm32f10x 嵌入式平台上运行,尽管目前它甚至在 Visual Studio PC 上也无法运行。因此这是一个纯 C 问题。
谢谢!
您还没有为 test_str.i1
分配任何内容。如果你这样做,我认为你的程序会工作。这个联合的想法是提供一种简单的方法来获取 unsigned int V16 中的 16 位。但是,这是依赖于平台的代码,因为 int 可能不是 16 位(通常是 32 位)。
联合的大小将是其最大成员的大小。但是,我不确定大小不匹配的对齐规则是什么。
最后,我认为获取位的最佳方法是使用按位运算符 &, |等等
我有以下遗留代码:
#define UINT8 unsigned char
#define UINT16 unsigned short
#define UINT32 unsigned long
typedef union
{
struct
{
UINT16 R1: 1;
UINT16 S1: 1;
UINT16 S2: 1;
UINT16 D1: 1;
UINT16 I1: 1;
UINT16 S3: 1;
UINT16 S4: 1;
UINT16 S5: 1;
UINT16 S6: 1;
UINT16 P1: 1;
UINT16 F1: 1;
UINT16 I2: 1;
UINT16 R2: 4;
}bb;
UINT16 V16;
}test_union11;
typedef struct /* memory index */
{ /* ++++++++++++ */
// Write Config 01-32
UINT16 i1; /* 0 */
UINT16 i2; /* 2 */
// Faults
UINT16 o3; /* 4 */
UINT16 o4; /* 6 */
UINT16 o5; /* 8 */
UINT16 o6; /* 10 */
// Values 01-08
UINT8 o7; /* 12 */
UINT8 o8; /* 13 */
UINT8 o9; /* 14 */
UINT8 o10; /* 15 */
UINT8 o11; /* 16 */
UINT8 o12; /* 17 */
UINT8 o13; /* 18 */
UINT8 o14; /* 19 */
// Values 09-12
UINT16 o15; /* 20 */
UINT16 o16; /* 22 */
UINT16 o17; /* 24 */
UINT16 o18; /* 26 */
// Values 13-14
UINT32 o19; /* 28 */
UINT32 o20; /* 32 */
UINT8 OctStr[8];
} test_str11;
test_str11 test_str1;
test_union11 test_union;
int test_memcpy(void) {
test_str1.o15 = 1500;
test_union.V16 = test_str1.i1;
memcpy(&test_union,&test_str1,sizeof(test_union11));
}
int main(void) {
test_memcpy();
printf("Test Pass!\n");
return 0;
}
test_union.V16 = test_str1.i1
行背后的想法是 test_union.bb 嵌套结构由结构 "test_str1" 中的数据填充吗?但是由于某种原因,既不是在那条线之后,也不是发生在 memcpy 之后。为什么?而union内部嵌套结构中的数字又是什么意思呢?
我测试了这种情况,当没有这样的数字具有更小的联合和结构并且 memcpy 成功时,尽管第一个元素分配的技巧没有成功。但是这样的语法:
un = (*(test_union1*)&st);
第二次测试也成功了,但没有提供代码。这两个表达有什么区别? test_union.V16 = test_str1.i1
是仅复制 i1 变量还是复制 test_union.bb 可以容纳的字节数?
该代码应该可以在 stm32f10x 嵌入式平台上运行,尽管目前它甚至在 Visual Studio PC 上也无法运行。因此这是一个纯 C 问题。 谢谢!
您还没有为 test_str.i1
分配任何内容。如果你这样做,我认为你的程序会工作。这个联合的想法是提供一种简单的方法来获取 unsigned int V16 中的 16 位。但是,这是依赖于平台的代码,因为 int 可能不是 16 位(通常是 32 位)。
联合的大小将是其最大成员的大小。但是,我不确定大小不匹配的对齐规则是什么。
最后,我认为获取位的最佳方法是使用按位运算符 &, |等等