问题描述
我想创建一个指向数组的指针数组,如果/当我的结果准备好时动态分配这些指针。以下代码使用一种类型来解决无法设置指针数组的问题,但函数 makeArray 始终返回相同内存地址。
预期的结果将是不同的地址,因此是单独可控的阵列。 (我需要这样做是因为我有非常大的数组,这些数组将随机填充但必须排序,而且我不想预先分配一个巨大的 2x2 数组(8GB 的顺序),也不想不断地重新分配和排序为新的结果进来了,所以我的解决方案是预先分配一个大的 1x1 数组,它可以有指向第二个暗淡的指针,这意味着如果/当它可用时,我可以将指向结果的指针放在正确的“槽”中)
module mymodule
contains
function makeArray(size)
integer :: size
integer,target,allocatable :: a(:)
integer,pointer :: makeArray(:)
allocate(a(size))
a = 0
makeArray => a
end function
end module mymodule
program test
use mymodule
implicit none
type :: IntPointer
integer,pointer :: ptr(:)
integer :: id
end type
type(IntPointer),allocatable :: ptrarray(:)
integer :: i
allocate(ptrarray(5))
ptrarray(1)%ptr => makeArray(1277)
ptrarray(1)%id = 1
ptrarray(2)%ptr => makeArray(13567)
ptrarray(2)%id = 2
ptrarray(1)%ptr(12) = 10
do i=1,size(ptrarray)
write(*,*) ptrarray(i)%id
write(*,*) LOC(ptrarray(i)%ptr)
end do
end program
谢谢
EDIT 解决了,我会留在这里以供后人使用: 我想问题的关键是能够分配一个二维数组,其中二维数组可能会有很大差异。 我需要寻找的神奇词是“Ragged Array”,看来this 帖子回答了我的问题。
解决方法
当我使用带有足够调试选项的 gfortran 时,它给出了答案:
10 | makeArray => a
| 1
Warning: Pointer at (1) in pointer assignment might outlive the pointer target [-Wtarget-lifetime]
因为 a
是一个可分配的,当函数退出时,它会被自动释放。
但是如果您尝试通过在 save
的声明中添加 a
来解决这个问题,那么当您第二次调用函数 makeArray
时,该函数将尝试分配一个已经分配的多变的。可能没有中间 a
的新设计会更好地工作。或者可能是与稀疏填充的数组不同的数据结构。也许是一个链表?