为什么 lua luaZ_fill 函数读取数据要这么写

struct Zio {
  size_t n;         /* 还未读取的字节数 */
  const char *p;        /* 缓冲区中的当前位置 */
  lua_Reader reader;
  void* data;           /* 额外数据 */
  lua_State *L;         /* Lua 状态(用于读取) */
};
int luaZ_fill (ZIO *z) {
  ....
  z->n = size - 1; /* 这里为什么要减1? */
  z->p = buff;
  return char2int(*(z->p++));
}
int luaZ_lookahead (ZIO *z) {
  if (z->n == 0) {
    if (luaZ_fill(z) == EOZ)
      return EOZ;
    else {
      z->n++;  /* luaZ_fill 把第一个字节移除,这里把它放回去 */
      z->p--;
    }
  }
  return char2int(*z->p);
}

luaZ_fill 函数从 reader 中读取数据,但是为什么 z->n = size - 1 要减1呢?看起来没有用。因为 luaZ_lookahead 函数会把它加回去。为什么不能这么写呢:

int luaZ_fill (ZIO *z) {
  ....
  z->n = size;
  z->p = buff;
  return char2int(*(z->p));
}
int luaZ_lookahead (ZIO *z) {
  if (z->n == 0) {
    if (luaZ_fill(z) == EOZ)
      return EOZ;
  }
  return char2int(*z->p);
}

原文链接 https://stackoverflow.com/questions/64400312

点赞
stackoverflow用户13546478
stackoverflow用户13546478

如果你有一个数组并且想要指定它的大小:

int x = 10;
char arr[x - 1]

正如大家所知,数组的下标从0开始,这意味着像上面的例子,如果你想创建一个大小为10的数组,你必须这样做 arr[x - 1] ,否则你将得到一个大小为11而不是10的数组。

2020-10-17 09:08:26