簡體   English   中英

Fortran指針函數:為什么這段代碼的行為取決於函數調用的順序?

[英]Fortran pointer functions: why does this code's behavior depend on the order of function calls?

上下文

下面發布的玩具Fortran代碼調用兩個指針函數。 也就是說,兩個函數都返回一個指針。 實際上,它們都是數組指針。 它們都嘗試做同樣的事情,即返回一個引用具有三個元素1,2和3的整數數組的整數數組指針。第一個函數使用指針賦值運算符(=>)將函數指針指向一個包含數據的可分配數組。 第二個函數通過指針直接分配一塊動態存儲器,用於存儲數據。 調用程序只打印返回數組的元素。

這是我覺得奇怪的事情。

  1. 如果我將a指向function1的結果,則結果不正確。 的第一個元素a似乎是“打一頓”: a具有023
  2. 如果我將b指向function2的結果,結果是正確的。 b得到123
  3. 更奇怪的是,指向b到的結果function2指向 afunction1 改變 a ,使得它成為正確的。 a則有123

為什么會這樣? 更確切地說,為什么一個指針函數返回一個指向可分配數組的指針,它會破壞調用者的那個數組的第一個元素? 更確切的是,為什么指向一個指針( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM