Jen*_*ens 6 c pointers standards-compliance
我可能会弄错,但我似乎记得对于给定的内存分配,例如
char *p = malloc(4);
指针p是分配中所有字节和超出该分配的第一个字节的有效指针.
因此,要通过指针访问存储器,p只有偏移p[0] .. p[3]是有效的.但是对于指针比较&( p[4] )也将是一个有效的指针.
&p[4], orp + 4是一个有效的指针,但不能取消引用。
C11 6.5.6 加法运算符
[...] 如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则求值不会产生溢出;否则,行为是未定义的。如果结果指向数组对象的最后一个元素,则不得将其用作所
*计算的一元运算符的操作数。
这个答案假设是p一个char *.
\n\n\n但对于指针比较 &( p[4] ) 也是有效的。
\n
指针p + 4(or&( p[4] )可以有效地与{0, 1, 2, 3, 4} 中的p + N, , or进行比较。这在 C11 6.5.8:5 中进行了说明:N<<===
\n\n\n当两个指针进行比较时,结果取决于所指向的对象在地址空间中的相对位置。如果指向对象类型的两个指针都指向同一个对象,或者都指向同一数组对象的最后一个元素,则它们比较相等。如果指向的对象是同一个聚合对象的成员,则指向后面声明的结构体成员的指针比较大于指向结构体中前面声明的成员的指针,指向下标值较大的数组元素的指针比较大于指向同一数组元素的指针具有较低的下标\n 值。指向同一联合对象成员的所有指针比较相等。如果表达式 P 指向数组对象的一个元素,并且表达式 Q 指向同一数组对象的最后一个元素,则指针表达式 Q+1 比较结果大于 P。在所有其他情况下,行为未定义。
\n
但是,p+4与 to 进行比较是无效的==,例如,&XwhereX是另一个变量。这是(根据我的 C 标准解读)未指定的行为。(当然,没有一个与top + N进行比较是有效的<=&X进行比较时,没有一个是有效的。)
\n\n\n两个指针比较相等当且仅当两者都是空指针,两者都是指向同一对象(包括指向对象的指针和其开头的子对象)或函数的指针,两者都是指向同一数组的最后一个元素之后的指针对象,或者一个是指向一个数组对象末尾的指针,另一个是指向另一个数组对象的开头的指针,该数组对象恰好紧随地址空间中的第一个数组对象。109)
\n\n109) 两个对象在内存中可能是相邻的,因为它们是较大数组的相邻元素或结构的相邻成员,且它们之间没有填充,或者因为实现选择如此放置它们,即使它们不相关。如果先前的无效指针操作(例如访问数组边界之外)产生未定义的行为,则后续比较也会产生未定义的行为。
\n\n(C11 6.5.9:6)
\n
严格来说,标准似乎没有在任何地方定义p + 4 == NULL(编辑:正如rici指出的,等于的唯一允许p + 4是q如果q是\xe2\x80\x9c恰好立即发生的不同数组对象的开始follow\xe2\x80\xa6\xe2\x80\x9d. 由于 NULL 不是任何对象的地址,因此结果为p + 4 == NULLfalse)。
这博文着眼于 C 语言中的这个和其他指针比较。
\n