Fortran中指向子数组的指针能否超出其子边界访问原数组?
关于Fortran中指针访问子段边界外索引的合法性问题
首先直接给结论:这种操作是完全非法的,会触发数组下标越界的未定义行为,绝对不推荐这么写。
咱们来一步步拆解你的代码逻辑:
- 你先创建了可分配的目标数组
arr(10,10),然后把指针ptr关联到它的子段arr(5:7,5:7)。 - 这里有个关键细节:当你用
ptr => arr(5:7,5:7)这种方式关联指针时,Fortran会默认给ptr设置全新的下标范围——也就是从1开始到子段的长度(这里是1:3, 1:3)。换句话说,ptr现在是一个独立的3×3指针数组,它的下标和原数组arr的下标已经没有直接对应关系了。 - 这时候你尝试访问
ptr(-1,4),不管原数组arr有没有对应的位置(哪怕arr(4,8)确实存在),对于ptr来说,-1低于它的下界1,4高于它的上界3,完全超出了指针自身的下标范围,属于明确的越界访问。
如果想要让指针的下标和原数组子段的下标保持一致,你可以在关联指针时显式指定下标界,比如:
ptr(5:7, 5:7) => arr(5:7, 5:7)
这样ptr的下标范围就和原数组的子段下标对齐了,访问ptr(5,5)就对应arr(5,5)。但哪怕这样,你要是访问ptr(-1,4)依然是越界,因为ptr的下界是5,-1还是超出了它的合法范围。
总结一下:
- 指针关联数组子段时,默认下标从1开始,和原数组下标无关
- 访问指针自身下标范围外的索引,无论原数组是否有对应位置,都是非法的
- 可以显式指定指针的下标界,但也不能超出这个指定的范围
内容的提问来源于stack exchange,提问作者Vladimir Kikhtenko
相关产品推荐
相关产品推荐

