gpt4 book ai didi

c - 指针算术在数组外是否仍然有效?

转载 作者:太空狗 更新时间:2023-10-29 16:53:18 26 4
gpt4 key购买 nike

我总是读到只要不离开数组的边界就定义了指针算法。我不确定我是否完全理解这意味着什么,我有点担心。因此这个问题。

假设我从指向数组开头的指针开始:

int *p = (int*) malloc(4 * sizeof(int));

现在我创建两个位于数组边界之外的新指针:

int *q = p + 10;
int *r = p - 2;

现在指针 q-10, q-9, ..., r+2, r+3,等等都在数组的范围内。它们有效吗?例如,r[3] 保证 给出与 p[1] 相同的结果吗?

我已经做了一些测试并且它有效。但我想知道这是否包含在通常的 C 规范中。具体来说,我正在使用 Visual Studio 2010、Windows,并且我正在使用 native C(而非 C++)进行编程。我被覆盖了吗?

最佳答案

您所做的工作适用于您正在使用的实现以及最流行的实现,但它不符合 C。正如克里斯引用的那样,

§6.5.6/8: If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined

它未定义的事实在未来可能会变得越来越重要,更高级的静态分析允许编译器将此类代码转化为 fatal error ,而不会产生运行时成本。

顺便说一下,将不在同一个数组中的指针相减未定义的历史原因是分段内存(想想 16 位 x86;熟悉它的人会想到“大”内存模型)。虽然指针可能涉及段和偏移量组件,但编译器可以仅对偏移量组件进行运算以避免运行时成本。这使得不在同一段中的指针之间的算术无效,因为差异的“高部分”丢失了。

关于c - 指针算术在数组外是否仍然有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com