【问题标题】:Accessing individual bytes of a struct using pointers使用指针访问结构的各个字节
【发布时间】:2014-01-19 05:49:52
【问题描述】:

我有一个需要对结构执行 CRC 操作的应用程序。我决定完成此任务的最佳方法是简单地遍历构成结构的所有单个字节并将它们添加到 CRC 例程中。严格命名为 Config,类型为 ConfigT。下面的代码大致描述了我想要做什么,我只需要了解使用指针算法访问结构字节的语法。

 uint16_t CalculateEepromChecksum()
 {
  uint16_t crc = 0;
  uint8_t *ptr = &Config;

   for (uint32_t i = 0; i < sizeof(ConfigT); i++)
   {
            crc = _crc16_update(crc, ptr[i]);
   }

    return crc;
  }

此函数编译失败:

 cannot convert 'ConfigT*' to 'uint8_t* {aka unsigned char*}' in initialization

...在以下行:

 uint8_t *ptr = &Config;

【问题讨论】:

    标签: c++ pointers struct


    【解决方案1】:

    您需要将crc 的地址传递给_crc16_update 才能对其进行修改。如果您不这样做,并且这不是编译错误,则充其量您可以预期未定义的行为。

    _crc16_update(&crc, *(ptr+i));
    

    此外,您可以在 struct 字节数组上使用数组表示法,而不是指针表示法。两种形式的工作方式相同,但是,第一种形式可能更好地表明您正在使用字节数组:

      _crc16_update(&crc, ptr[i]);
    

    【讨论】:

    • 啊,好眼力。假设是 crc = _crc16_update()。这是我的错误
    • @chris12892 现在说得通了。
    • 我更新了原始问题以修复 crc uint16 问题。使用数组表示法失败并出现编译器错误错误 6 no match for 'operator[]' in 'Config[i]'
    • @chris12892 应该是ptr[i]。无法像访问数组一样访问 struct,除非您像以前一样将其转换为固定宽度的类型。
    • 你没有仔细阅读我写的东西。 uint8_t *ptr = (uint8_t *)&amp;Config;Config 的地址被类型转换为 uint8_t 指针 (uint8_t *)。注意*
    【解决方案2】:

    您不能相互分配不同的指针类型,因为它们不兼容。如果需要,您必须将其显式转换为其他类型

    uint8_t *ptr = (uint8_t *)&Config;
    

    或者更好的是,将 _crc16_update 声明为 _crc16_update(uint16_t *crc, void* data, int length); 并在函数内部循环,而不是为每个字节调用它

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多