执行以下操作是否有效:
real(kind=rk), allocatable, target :: arr(:,:)
real(kind=rk), pointer :: ptr(:,:)
allocate(arr(10, 10))
ptr => arr(5:7, 5:7)
arr = 0
ptr(-1, 4) = 1
e.g。创建指向数组子部分的指针,然后访问子部分之外的索引,但是存在于原始数组中?
答案 0 :(得分:1)
具有指针属性的数组本身仍然是一个数组,具有自己的边界。尝试访问这些边界之外的数组元素无效。
在指针的情况下,这样的访问可以"工作" - 该程序仍然拥有内存。但这是无效的。
答案 1 :(得分:0)
自Fortran 2003以来,可以在指针赋值中使用 bounds-spec :
real(kind=rk), allocatable, target :: arr(:,:)
real(kind=rk), pointer :: ptr(:,:)
allocate(arr(10, 10))
ptr(-1:,-1:) => arr(3:8, 3:8)
arr = 0
ptr(-1, 4) = 1