【发布时间】:2026-02-12 17:40:02
【问题描述】:
所以,正如我从 Michael Burr 的 cmets 到 this answer 了解到的那样,C 标准不支持从经过数组中第一个元素的指针(我想这包括任何分配的内存)的整数减法。
来自the combined C99 + TC1 + TC2 (pdf) 的第 6.5.6 节:
如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则计算不应产生溢出;否则,行为未定义。
我喜欢指针算术,但这从来都不是我之前担心过的事情。我一直认为:
int a[1];
int * b = a - 3;
int * c = b + 3;
那个c == a。
因此,虽然我相信我以前做过这种事情并且没有被咬,但这一定是由于我合作过的各种编译器的好意——他们已经超越了标准要求指针算术按我想象的方式工作。
所以我的问题是,这有多普遍?是否有常用的编译器对我不那么友好?超出数组边界的正确指针算法是事实上的标准吗?
【问题讨论】:
-
这不是编译器的问题,而是 CPU 架构的问题。那里有一些晦涩的内存模型,您通常不能假设所有系统都具有纯线性内存。只是不要将指针视为内存地址。他们不是。它们有一组单独的限制。
标签: c arrays pointers compiler-construction pointer-arithmetic