Arrays fortran指针数组

Arrays fortran指针数组,arrays,pointers,fortran,Arrays,Pointers,Fortran,同样,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

同样,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_故障。这里有什么问题吗?

ctx
在子例程
alloc\u ctx
的范围内,并在您离开子例程后立即解除分配。稍后(通过指针)访问它将导致segfault

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

您为什么不直接分配
选项卡\u ctx\u ptr(i)%p\u 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
至于释放:您可以使用类似这样的方法来释放所有指针(但不是数组本身):


ctx
在子例程
alloc_ctx
的范围内,并在您离开子例程后立即解除分配。稍后(通过指针)访问它将导致segfault

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

您为什么不直接分配
选项卡\u ctx\u ptr(i)%p\u 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
至于释放:您可以使用类似这样的方法来释放所有指针(但不是数组本身):


为什么这么做,我的意思是不直接?事实上,这是更复杂代码的第一步,该代码计划管理多线程分配,并确保不同内存(例如NUMA)中的数据的局部性。最后,如果存在自动解除分配:如何在C代码中执行?我编辑了我的答案以展示一个示例。。。顺便说一句:检查分配的
stat
总是一个好主意!现在,我很困惑。。。什么是C代码?你的例子是用Fortran写的?!我当然检查了,我只是简化了示例。顺便说一句:你的解决方案是有效的,所以首先,谢谢,其次,我确信我读过一个分配的例子,就像我在论坛上的例子一样……为什么要这样做,我的意思是不直接?事实上,这是更复杂代码的第一步,该代码计划管理多线程分配,并确保不同内存(例如NUMA)中的数据的局部性。最后,如果存在自动解除分配:如何在C代码中执行?我编辑了我的答案以展示一个示例。。。顺便说一句:检查分配的
stat
总是一个好主意!现在,我很困惑。。。什么是C代码?你的例子是用Fortran写的?!我当然检查了,我只是简化了示例。顺便说一句:你的解决方案是有效的,所以首先,谢谢,其次,我相信我读过一个分配的例子,就像我在论坛上的例子一样。。。