ZLib 和 memcpy

ZLib and memcpy

在Zlib算法中我们有解码功能。这个函数称为膨胀。在函数的末尾,我们需要将字节复制到输出。 示例:(full code)

  if (copy > left) copy = left;
        left -= copy;
        state->length -= copy;
        do {
            *put++ = *from++;
        } while (--copy);
        if (state->length == 0) state->mode = LEN;
        break;
    case LIT:
        if (left == 0) goto inf_leave;

在此示例中,我们执行了 while 循环,通过递增指针来复制字节。所以我们有 "copy" 次迭代。 我有疑问:为什么我们不能只使用 memcpy(put, from, copy) (然后递增指针)而不是循环? 为什么在某些情况下(按8kb块编码时)会出现错误的解码结果?

关于错误结果:在解码结果中我们可以有未初始化的字节(一点点)。好像 memcpy 从未初始化的内存中复制一些字节。

我无法使用 memcpy(),也无法使用 memmove()。原因是副本经常重叠,目的是复制 just-copied 字节。 memcpy() 对于重叠的源和目标块的行为是 未定义的 memmove() 在那种情况下的行为非常明确,但恰恰是 相反 所需要的,其中 memmove() 避免复制 just-copied 数据。

我不知道你做了什么导致了错误的结果,但是那里的副本永远不会从未初始化的内存中复制。