size_t用作公式中的值

Pet*_*rba 0 c size-t

这是一个功能阅读线的简短片段.这bufsize与它相比((size_t)-1)/2有何可能?

我想象将变量与例如比较.int - 这是不可能的; 相反,INT_MAX是正确的,我想.那么该代码如何实际工作并且不会出错?

int c;
size_t bufsize = 0;
size_t size = 0;

while((c=fgetc(infile)) != EOF) {
    if (size >= bufsize) {
        if (bufsize == 0)
                bufsize = 2;
        else if (bufsize <= ((size_t)-1)/2)
                bufsize = 2*size;
        else {
                free(line);
                exit(3);
        }
        newbuf = realloc(line,bufsize);
        if (!newbuf) {
                free(line);
                abort();
        }
        line = newbuf;
    }
    /* some other operations */
}
Run Code Online (Sandbox Code Playgroud)

Ry-*_*Ry- 6

(size_t)-1
Run Code Online (Sandbox Code Playgroud)

这是铸造价值-1size_t.(type)value是C的演员.

由于size_t是无符号类型,这实际上是size_t可以容纳的最大值,因此它用于确保缓冲区大小实际上可以安全地加倍(因此后续除以2).

  • @halex,这与数字的表示无关.`int`(以及因此`-1`)很可能在其他两个可能的表示中表示,这些表示仍然会导致相同的结果.从有符号类型到无符号类型的转换只使用值而不是表示. (3认同)
  • @halex:你错了; 它与表示无关,因为强制转换不对表示进行操作; 他们依靠价值观运作.`(size_t)-1`将整数-1模`SIZE_MAX + 1`减小到0到`SIZE_MAX`范围内的值.`(size_t)-1`只是一种编写`SIZE_MAX`的方法,不依赖于宏(在C99之前不存在). (2认同)