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 位)。

联合的大小将是其最大成员的大小。但是,我不确定大小不匹配的对齐规则是什么。

最后,我认为获取位的最佳方法是使用按位运算符 &, |等等