我总是读到指针算法是定义的,只要你不离开数组的边界。我不确定我是否完全明白这意味着什么,我有点担心。因此,这个问题。
假设我从指向数组开头的指针开始:
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 2010,Windows,我是用本机C(而不是C++)编程。我被掩护了吗?
发布于 2012-08-24 03:51:13
您所做的工作涉及您正在使用的实现,以及大多数流行的实现,但正如chris引用的那样,它不符合C。
§6.5.6/8:如果指针操作数和结果指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则计算值不应产生溢出;否则,该行为是未定义的。
它未定义的事实在将来可能变得越来越重要,通过更高级的静态分析,编译器可以将这类代码转化为致命的错误,而不会产生运行时成本。
顺便说一句,删除不在同一数组中的指针的历史原因是分段内存(想想16位x86;熟悉它的人会想到“大”内存模型)。虽然指针可能涉及分段和偏移组件,但编译器可以仅在偏移组件上执行算法,以避免运行时成本。这使得不在同一段中的指针之间的算术无效,因为差异的“高部分”丢失了。
发布于 2012-08-24 03:51:14
根据C11标准,第6.5.6/8节(我将第一部分用于上下文):
当具有整数类型的表达式添加到指针或从指针中减去时 ..。 如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则计算值不会产生溢出;否则,行为将未定义。
因此,在数组之外而不是结束后的结果是未定义的行为。
https://stackoverflow.com/questions/12102880
复制相似问题