[英]Fortran pointer functions: why does this code's behavior depend on the order of function calls?
下面發布的玩具Fortran代碼調用兩個指針函數。 也就是說,兩個函數都返回一個指針。 實際上,它們都是數組指針。 它們都嘗試做同樣的事情,即返回一個引用具有三個元素1,2和3的整數數組的整數數組指針。第一個函數使用指針賦值運算符(=>)將函數指針指向一個包含數據的可分配數組。 第二個函數通過指針直接分配一塊動態存儲器,用於存儲數據。 調用程序只打印返回數組的元素。
這是我覺得奇怪的事情。
a
指向function1
的結果,則結果不正確。 的第一個元素a
似乎是“打一頓”: a
具有0
, 2
, 3
。 b
指向function2
的結果,結果是正確的。 b
得到1
, 2
, 3
。 b
到的結果function2
指向后 a
以function1
改變 a
,使得它成為正確的。 a
則有1
, 2
, 3
。 為什么會這樣? 更確切地說,為什么一個指針函數返回一個指向可分配數組的指針,它會破壞調用者的那個數組的第一個元素? 更確切的是,為什么指向一個指針( b
)產生於另一個指針(副作用a
),其中目標來自被寫入,以免互相在所有互動不同的功能?
我使用GNU Fortran編譯器v.4.3.3,運行帶有Ubuntu(Jaunty)的英特爾筆記本電腦。 您的結果可能會有所不同,這可能會更有趣。 最后,一如既往,我可能是操作員錯誤,至少對我來說這很有趣。
program main
implicit none
integer, dimension(:), pointer :: a, b
integer :: i
a => function1()
b => function2()
do i = 1, 3
print *, a(i)
end do
! do i = 1, 3
! print *, b(i)
! end do
contains
function function1 ()
integer, dimension(:), allocatable, target :: array
integer, dimension(:), pointer :: function1
allocate(array(3))
array(1) = 1
array(2) = 2
array(3) = 3
function1 => array
end function function1
function function2 ()
integer, dimension(:), pointer :: function2
allocate(function2(3))
function2(1) = 1
function2(2) = 2
function2(3) = 3
end function function2
end program main
function1的變量數組是一個局部變量 - 因為它是在沒有“save”屬性的情況下聲明的,它不是持久的,並且在函數退出時是未定義的。 您將數組的地址分配給function1,“保留”該地址,但是一旦變量在退出函數后變為未定義,該地址就沒有意義。 一個可能的實現是,function1的數組將放在堆棧上,當function1返回時,堆棧的那個區域將被釋放用於其他用途。 但這只是對可能實現的猜測 - 關鍵是在變量未定義后不允許使用指針值。 可分配變量在超出范圍時會自動釋放,除非您使用“save”屬性聲明它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.