Q这是一个巧妙的技巧:如果我写
int realarray[10]; int *array = &realarray[-1];我可以把array当作是基于 1 的数组。
A虽然这种技术很有吸引力(并且在《C语言数值计算方法》的旧版本中使用过),但它并不严格符合C标准。指针算术的定义仅限于指针指向同一分配内存块的内部,或者指向其末尾的虚构的“终止”元素;否则,行为是未定义的,*即使该指针没有被解引用*。上面的代码计算了一个指向内存开头之前的内存的指针realarray,并且如果减去偏移量时生成了非法地址(可能是因为地址试图“环绕”到某个内存段的开头),则可能失败。
其他链接: “是的,弗吉尼亚”
参考文献: K&R2 第 5.3 节 第 100 页,第 5.4 节 第 102-3 页,第 A7.7 节 第 205-6 页
ISO 第 6.3.6 节
Rationale 第 3.2.2.3 节