【发布时间】:2010-12-07 13:51:16
【问题描述】:
如果你有以下代码,其中 p 是一个指针:
p = p + strlen(p) + size_t(1);
由于strlen() 和size_t 都是size_t,我应该将代码转换为ptrdiff_t 吗?
p = p + (ptrdiff_t)(strlen(p) + size_t(1));
如果是,为什么?
谢谢, 格雷格
【问题讨论】:
-
您尝试做的是无效的 C++,因为
p + (ptrdiff_t)(strlen(p) + size_t(1))地址不在p指向的字符数组中。 -
不一定。 p 数组不需要在 null 处结束。
-
@JB Jansen:一般情况下你无法知道——这取决于
p的内存是如何分配的。 C 中没有什么可以阻止字符串比托管它的内存块更短(!)。 -
@JB、Alex、FrankH:无论如何,在过去的最后一个内存位置构造一个指向内存位置的指针是定义明确且正常的。例如,
std::vector::end()就是这样做的。您不能取消引用该指针,但它对所有其他指针操作都是明确有效的。标准中的相关引用:除非两个指针都指向同一个数组对象的元素,或超过数组对象的最后一个元素,否则行为未定义。
跨度> -
还应该注意,这里真的不需要 size_t 转换。编译器可能会抱怨“有符号/无符号不匹配”,在这种情况下,正确的解决方法是编写
1u或1ul而不是强制转换。
标签: c++