2

同样,Fortran 中的指针数组。好吧,我有一个派生类型:

type :: t_context_pointer  
    type(t_context),pointer :: p_ctx  
end type t_context_pointer

当我在主程序中执行时:

type(t_context_pointer),allocatable :: tab_ctx_ptr(:)  
type(t_context),allocatable,target :: ctx  
allocate(tab_ctx_ptr(1))  
allocate(ctx)  
tab_ctx_ptr(1)%p_ctx=>ctx

有用。但是当我使用函数调用时:

type(t_context_pointer),allocatable,target :: tab_ctx_ptr(:)
allocate(tab_ctx_ptr(n))
call alloc_ctx(tab_ctx_ptr,n,1)

与其他地方:

subroutine alloc_ctx(tab_ctx_ptr,n,i)
    integer,intent(in) :: n,i
    type(t_context_pointer),intent(inout) :: tab_ctx_ptr(n)

    type(t_context),allocatable,target :: ctx

    allocate(ctx)
    tab_ctx_ptr(i)%p_ctx=>ctx
end subroutine

它稍后在代码中出现 seg_fault。这里有什么问题吗?

4

1 回答 1

4

ctx位于子例程的范围内,alloc_ctx并在您离开子例程后立即被释放。稍后访问它(通过指针)将导致段错误。

在第一个示例中,您ctx在主程序中进行分配,因此其范围将一直到程序结束。

你为什么不allocate tab_ctx_ptr(i)%p_ctx直接:

subroutine alloc_ctx(tab_ctx_ptr,n,i)
    integer,intent(in) :: n,i
    type(t_context_pointer),intent(inout) :: tab_ctx_ptr(n)

    allocate(tab_ctx_ptr(i)%p_ctx)
end subroutine

至于释放:你可以使用这样的东西来释放所有指针(但不是数组本身):

subroutine dealloc_ctx(tab_ctx_ptr,n)
    integer,intent(in) :: n
    type(t_context_pointer),intent(inout) :: tab_ctx_ptr(n)
    integer            :: i

    do i=1,n
      ! Check whether the current element has an allocated element and 
      ! deallocate if necessary. 
      if ( associated(tab_ctx_ptr(i)%p_ctx) ) deallocate(tab_ctx_ptr(i)%p_ctx)
    enddo ! i
end subroutine
于 2013-10-16T09:46:16.913 回答