【问题标题】:C: Find occurrences of bytes in region of memoryC:查找内存区域中出现的字节
【发布时间】:2018-10-11 12:59:33
【问题描述】:

我正在尝试编写一个函数,该函数仅使用基于指针的逻辑在内存区域 (baseAddr) 中搜索某个字节 (Byte),计算出现次数,并将偏移量存储在数组 (Offsets) 中。这是我目前所拥有的:

uint8_t findBytes( uint16_t* const Offsets, const uint8_t* const baseAddr,
                                            uint32_t length, uint8_t Byte) {
    uint8_t bytesRead = 0;
    int count = 0;
    while (bytesRead < length) {
        if ((baseAddr + bytesRead) == Byte) {
            *(Offsets + count) = bytesRead;
            count++;
        }
        bytesRead++;
    }

    return count;
}

无论出于何种原因,如果我使用 (bytesRead

【问题讨论】:

  • uint8_t 类型变量的最大值是多少?
  • 一个简单的printf 状态变量将在一分钟内揭示这个错误。
  • 这对无限循环很有意义!完全忘记了它只有 255。我改变了它,现在的问题是它一直找到 0 次出现并且没有存储任何偏移量,即使内存区域中有明确的出现。
  • 不要更改已回答的问题!回滚。

标签: c pointers byte


【解决方案1】:

bytesReaduint8_t,最大值为255。如果你有uint32_t length,你的偏移量应该是相同的数据类型。由于每个字节都可能匹配,因此您的计数(返回值)也需要是相同的类型,偏移量数组也是如此。

更多问题:

if ((baseAddr + bytesRead) == Byte)

你不是在这里取消引用指针,你只是检查它的值。您的编译器应该在此处针对类型不匹配发出警告。

试试:

if (*(baseAddr + bytesRead) == Byte)

最后,您需要确保offsets 指向足够的内存。同样,*每个字节都可能匹配,这意味着 offsets 应该与输入数据的长度(以元素为单位)相同。

【讨论】:

  • 谢谢!我不理解指针。我将 bytesRead 更改为 uint32_t 并解决了无限循环问题,并且您的解决方案也解决了比较问题。
  • @SamTyson 如果某个答案帮助您解决了您的问题,那么我们将不胜感激支持它,然后单击灰色复选标记使其成为接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多