C++ size_t或ptrdiff_t

won*_*yte 10 c++

如果您有以下代码,其中p是指针:

p = p + strlen(p) + size_t(1);
Run Code Online (Sandbox Code Playgroud)

既然strlen()size_t都是size_t,我应该把代码转换成ptrdiff_t

p = p + (ptrdiff_t)(strlen(p) + size_t(1));
Run Code Online (Sandbox Code Playgroud)

如果是这样的话?

谢谢,格雷格

Fré*_*idi 18

std :: ptrdiff_t已签名.std :: size_t是无符号的.铸造strlen(p)ptrdiff_t才有意义,如果p能有一个负的长度,这是不可能的.

但是,如果p足够大(例如,在大多数32位平台上大于2,147,483,647字节),那么转换可能会溢出结果签名值.所以它可能会在你的指针算术中引入一个错误.

最好坚持在size_t这里.

  • @VaddadiKartick 在 64 位系统上 `PTRDIFF_MAX` 等于 `9223372036854775807` 看起来足够了。 (4认同)