【问题标题】:Array members inside the structure variable结构体变量内的数组成员
【发布时间】:2018-06-21 16:14:47
【问题描述】:

我的结构如下

typedef struct s_CanMsg
{
    uint32_t id;
    uint16_t timestamp;
    uint8_t  data[8];
    uint8_t  dlc;
    bool_t   isExtended;
    bool_t   isRemote;
} s_CanMsg_t;

我有一个结构变量如下

 s_CanMsg_t CANEraseResponse;

现在我正在尝试将数组传递给结构变量的数据成员,如下所示:

CANEraseResponse.data[8] = {0x00, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00};

这显示语法错误,如何将数据传递给具有数组成员的结构变量?提前致谢。

【问题讨论】:

    标签: c arrays


    【解决方案1】:

    定义变量的时候可以初始化整个结构体:

    s_CanMsg_t CANEraseResponse = {
        some_value_for_id,
        some_value_for_timestamp,
        {0x00, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00},
        some_value_for_dlc,
        some_value_for_isExtended,
        some_value_for_isRemote
    };
    

    您也可以使用指示符仅显式初始化数组成员;

    s_CanMsg_t CANEraseResponse = {
        .data = {0x00, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00}
    };
    

    然后所有其他成员将被初始化为零。

    当然你也可以定义一个临时数组并复制到结构数组中:

    static uint8_t data[8] = {0x00, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00},
    
    s_CanMsg_t CANEraseResponse;
    memcpy(CANEraseResponse.data, data, sizeof data);
    

    最后,如果以上方法都不可接受,那么剩下的唯一解决方案就是显式分配给数组的每个元素:

    CANEraseResponse.data[0] = 0x00;
    CANEraseResponse.data[1] = 0xFF;
    CANEraseResponse.data[2] = 0x00;
    CANEraseResponse.data[3] = 0x04;
    CANEraseResponse.data[4] = 0x02;
    CANEraseResponse.data[5] = 0x00;
    CANEraseResponse.data[6] = 0x00;
    CANEraseResponse.data[7] = 0x00;
    

    【讨论】:

    • 为什么我们不能像下面CANEraseResponse.data[8] = {0x00, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00};那样直接初始化一个数组
    • @user8540390 因为它不是 C 被指定的工作方式。如果您看到我更新的答案,那么您将希望了解原因,以及CANEraseResponse.data[8] 的含义。
    • 但是我们在指针的情况下使用memcpy,在字符串的情况下使用strcpy,但是我们可以像下面这样直接初始化数组,对吗? int array[5]={1,2,3,4,5}
    • @user8540390 因为您无法初始化已经存在的内容。它不再是初始化。
    • @user8540390 变量定义和初始化与赋值有很大不同。
    【解决方案2】:

    您使用的符号只能用于初始化数组。一旦你声明了你的结构变量,你就已经过了初始化。但是,您可以使用称为“指定初始值设定项”的东西来执行此操作,如下所示:

    s_CanMsg_t CANEraseResponse = {.data= {0x00, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00}};
    

    【讨论】:

      【解决方案3】:

      CANEraseResponse.data[8] 指的是 data 成员的第 9 个元素(因为数组是从零开始的。尝试删除 [8]。

      编辑/澄清:删除[8] 不会解决您的问题,但您应该知道CANEraseResponse.data[8] 指向data 数组之外的位置。

      【讨论】:

      • 删除 [8] 无济于事。您不能将一个数组分配给另一个数组。
      • 是的,你是对的。仍然data[8] 显示了对数组变量如何工作的误解,所以我认为原始海报会从更正中受益。
      • @Marc 的误解更多的是 OP 试图将其视为初始化,就像你会说的,int data[8] = {...};,而不是尝试将值设置在数组的第 8 位。
      【解决方案4】:

      您不能直接在 C 中分配数组。除了其他答案中显示的初始化技术外,您还可以使用复合文字和 memmove()(或 memcpy()):

      memmove(CANEraseResponse.data, (uint8_t[]){ 0x00, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00 }, sizeof(CANEraseResponse.data));
      

      【讨论】:

        猜你喜欢
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 2019-07-28
        • 2021-09-01
        • 2011-07-25
        相关资源
        最近更新 更多