因此,正如我从Michael Burr对此答案的评论中了解到的那样,C 标准不支持从数组中第一个元素(我想包括任何分配的内存)的指针中减去整数。
来自组合 C99 + TC1 + TC2 (pdf) 的第 6.5.6 节:
如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则计算不应产生溢出;否则,行为是未定义的。
我喜欢指针算术,但这从来不是我以前担心过的事情。我一直假设:
int a[1];
int * b = a - 3;
int * c = b + 3;
那个c == a
。
因此,虽然我相信我以前做过这种事情并且没有被咬,但这一定是由于我使用过的各种编译器的好意——它们已经超出了标准所要求的使指针算术按我想象的方式工作。
所以我的问题是,这有多普遍?是否有常用的编译器对我不那么友好?超出数组边界的正确指针算术是事实上的标准吗?