Cod*_*ird 6 fortran gfortran null-pointer
我正在尝试使用 来学习 Fortran2018 gfortran。在使用指针时,我注意到似乎没有测试空指针的工具。所以我有两个问题:
更实际地说,在下面的代码片段中:我们如何在执行过程中的任何时刻找出分配给p是否“安全”?allocate(可能会想象一个更复杂的、nullify和语句序列deallocate。)
program test
implicit none
real, pointer :: p
! p = 333.333 ! Segfault, p is neither defined, nor allocated
! Since p is not defined, checking whether it's
! associated to a target gives arbitrary results:
print *, "Start: Pointer p associated? ", associated(p) ! Result: True or False
nullify(p) ! Now p is defined, but `null`
print *, "Nullyfied: Pointer p associated? ", associated(p) ! False
! p = 123.456 ! Still a segfault
allocate(p) ! Now p can be accessed
print *, "Allocated: Pointer p associated? ", associated(p) ! True
p = 987.654 ! Now assignment is possible
allocate(p) ! Loses the value pointed to by p.
print *, p ! Result: 0.00000000
deallocate(p) ! Now accessing p generates a segfault again.
print *, "Deallocated: Pointer p associated? ", associated(p) ! False
! Never allowed:
! allocated(p)
! p == null()
! p .eqv. null()
end program test
Run Code Online (Sandbox Code Playgroud)
一般来说,没有安全的方法来判断指针是否“准备好使用”,就像没有安全的方法来判断变量当前是否已定义一样。
仅当指针具有定义的关联状态时才可以使用内部函数ASSOCIATED,但是没有类似的方法来确定(在 Fortran 程序本身内)指针是否具有定义的关联状态。
如果指针具有已定义的关联状态,ASSOCIATED则会告诉您该指针是否指向某物(甚至在某些情况下是否可以使用它是否指向特定的东西)并且可以使用。
但是,如果指针不是已定义的指针关联,则尝试查询其关联状态是违反 Fortran 标准的(这比未定义的结果更强,这意味着您的整个程序已损坏)。
您可以通过采取合理的步骤来确保指针关联状态不会变为未定义或开始时未定义,但作为程序员,了解关联状态是否已定义完全是您的责任。
一种提供帮助的方法是设置指针的初始关联状态:
real, pointer :: p => NULL() ! Defined association status, not-associated
real, pointer :: q ! Undefined association status
print *, ASSOCIATED(p) ! Allowed
print *, ASSOCIATED(q) ! Not allowed
end
Run Code Online (Sandbox Code Playgroud)
(我不会说这ASSOCIATED(p)告诉了我们.FALSE.,因为这ASSOCIATED(q)意味着我们没有有效的程序。)
总而言之,如果您小心的话,您可以使用ASSOCIATED可靠的方法来判断指针是否关联,但您必须小心。