前言:我知道很难找到这样的用例。这个问题纯粹是理论上的,是出于好奇而提出的。
采取以下措施:
char b[SOME_SIZE];
是这个吗:
((char *)5) + ((uintptr_t)b)
保证产生与更传统的结果相同的结果:
(b) + ((uintptr_t)5)
假设实现定义了
uintptr_t
?
如果我将 'pointer' (包含偏移量)添加到包含地址的
uintptr_t
,结果会如预期吗?即,就像我直接将偏移量添加到地址一样?
严格来说,这是未定义的行为。
执行指针算术,特别是向指针添加值,仅当指针指向有效数组对象(或单个对象)的成员并且结果指向同一数组对象的成员时才有效。 C 标准关于加法运算符的第 6.5.6p8 节对此进行了详细说明:
对整数类型的表达式进行加减运算时 对于指针,结果具有指针操作数的类型。如果 指针操作数指向数组对象的元素,并且数组 足够大,结果指向与 原始元素使得下标的差异 结果和原始数组元素等于整数表达式。 换句话说,如果表达式 P 指向 an 的第 i 个元素 数组对象,表达式 (P)+N(相当于 N+(P))和 (P)-N (其中 N 的值为 n)分别指向第 i+n 和 数组对象的第 i−n 个元素(前提是它们存在)。此外,如果 表达式 P 指向数组对象的最后一个元素, 表达式 (P)+1 指向数组对象的最后一个元素, 如果表达式 Q 指向数组的最后一个元素 对象,表达式 (Q)-1 指向数组的最后一个元素 目的。 如果指针操作数和结果都指向元素 同一数组对象,或数组的最后一个元素 对象,评估不得产生溢出;否则, 行为未定义。 如果结果指向最后一个元素 数组对象的,它不能用作一元 * 的操作数 被评估的运算符。
所以在这个表达式的情况下:
((char *)5) + ((uintptr_t)b)
指针表达式
(char *)5
不指向有效对象(除非您所在的系统明确允许使用“5”作为有效地址),因此对其执行算术是未定义的。