相关疑难解决方法(0)

ptrdiff_t可以表示指向同一数组对象元素的所有指针的减法吗?

对于指针的减法ij同一数组对象元素,[expr.add#5]中的注释读取:

[  注意:如果值i-j不在类型的可表示值范围内std?::?ptrdiff_­t,则行为未定义.-  结束说明 ]

但是给出[support.types.layout#2],其中指出(强调我的):

  1. 该类型ptrdiff_­t是一个实现定义的有符号整数类型,它可以保存数组对象中两个下标的差异,如[expr.add]中所述.

结果是否可能i-j不在可表示的值的范围内ptrdiff_t

PS:如果我的问题是由于我对英语的理解不足造成的,我道歉.

编辑:相关:为什么数组的最大大小"太大"?

c++ arrays pointer-arithmetic language-lawyer ptrdiff-t

32
推荐指数
1
解决办法
569
查看次数

是否有定义的方法在C11中进行指针减法?

有没有办法在C11中从另一个指针中减去一个指针,并且总是定义结果?

如果结果不能表示为类型ptrdiff_t,则标准表示行为未定义.

我对依赖于静态断言的解决方案持开放态度,这些断言有望在现代通用32或64位环境中传递合理的实现.我想避免依赖任何类型的运行时检查的解决方案.

如果指向的类型的大小大于1,我可以静态断言size_t和ptrdiff_t具有相同数量的非填充位.这种局部解决方案依赖于我不确定的两件事,所以对此的任何反馈都会提供部分答案:

  1. 在现代通用32或64位环境中的合理实现中,可以预期ptrdiff_t具有比size_t少至少一个值位.

  2. 我对标准的理解是正确的,因为定义了两个指向大小大于1的对象的指针之间的差异,即使指针被强制转换为字符指针时,也会定义相同的差异.这种理解似乎与委员会草案中的脚注106不一致,但我的理解是脚注不是规范性的.

2
推荐指数
1
解决办法
831
查看次数