Pointers 为什么不能在Fortran-90中连续分配指针链?

Pointers 为什么不能在Fortran-90中连续分配指针链?,pointers,linked-list,fortran,allocation,Pointers,Linked List,Fortran,Allocation,我正在尝试在Win32/x86平台上使用Fortran 90中的指针学习链表的数据结构 但是,当我运行的测试用例仅仅是为了构建一个包含100个项目的列表时,程序终止时会出现“访问冲突”错误 在错误发生之前,列表还远远没有完成 在调试运行中,结果表明,在某个时刻,下一个指针的分配失败 我想知道为什么会这样 如何使用指针成功构建链表 代码如下: TYPE Ptr INTEGER :: I TYPE(Ptr),POINTER :: PREV,NEXT END T

我正在尝试在Win32/x86平台上使用Fortran 90中的指针学习链表的数据结构

但是,当我运行的测试用例仅仅是为了构建一个包含100个项目的列表时,程序终止时会出现“访问冲突”错误

在错误发生之前,列表还远远没有完成

在调试运行中,结果表明,在某个时刻,下一个指针的分配失败

我想知道为什么会这样

如何使用指针成功构建链表

代码如下:

TYPE Ptr  
    INTEGER           :: I
    TYPE(Ptr),POINTER :: PREV,NEXT
END TYPE Ptr

TYPE(Ptr),POINTER :: P
INTEGER           :: IP,Err

ALLOCATE(P)

DO IP=1,100

    P%I = IP

    IF ( .NOT.ASSOCIATED(P%NEXT) ) THEN
                ALLOCATE(P%NEXT, STAT=Err ) 
    END IF

    P%NEXT%PREV => P
    P           => P%NEXT

END DO

在使用gfortran 7.2的UBUNTU上,您的程序编译后运行良好。但是,您的程序有两个问题可能会使编译器崩溃: 分配
p
后,指针
p%next
p%prev
的状态未定义。可能是编译器在语句
IF(.not.associated(p%next))
时出错,因为
p%next
的状态未定义。在使用指针或以任何方式引用指针之前,请始终将其置零。尝试:

program pointers
!
TYPE Ptr
    INTEGER           :: I   
    TYPE(Ptr),POINTER :: PREV,NEXT
END TYPE Ptr
!
TYPE(Ptr),POINTER :: P => NULL()     ! Make sure all pointer are nullified
TYPE(Ptr),POINTER :: head => NULL() 
TYPE(Ptr),POINTER :: temp => NULL() 
INTEGER           :: IP,Err
!
NULLIFY(P)     ! This is identical to the nullify in the declaration statement
NULLIFY(head)  ! I've added it to show both styles   
NULLIFY(temp)
!
ALLOCATE(P)
NULLIFY(P%NEXT)   ! Always nullify pointers
NULLIFY(P%PREV)   ! Always nullify pointers
head => P         ! To keep a header to your list is a good idea
!
DO IP=1,100
  write(*,*) ip
  P%I = IP*IP     ! Trivial unimportant change 
!
  IF ( .NOT.ASSOCIATED(P%NEXT) ) THEN
            ALLOCATE(P%NEXT, STAT=Err ) 
     P%NEXT%I = ip+1      ! define entries
     NULLIFY(P%NEXT%NEXT) ! for next node
     NULLIFY(P%NEXT%PREV) ! for all elements of your TYPE
  END IF
! 
  P%NEXT%PREV => P
  P           => P%NEXT
!
END DO
!
temp => head                ! temporary pointer to navigate
DO WHILE( ASSOCIATED(temp) )
  write(*,*) ' AT NODE ', temp%i
  temp => temp%next
ENDDO
!
end program pointers

正如@Alexander Vogt所指出的,你失去了列表的开头。我添加了一个名为head的指针来保留列表的开头。如果您查看输出,您会注意到程序实际上生成了一个100+1条目的列表,因为您先生成
p
,然后再添加100次
p%,接下来

您能给出确切的状态代码
Err
?或者,省略
STAT=Err
并将错误打印到终端。
P=>P%NEXT
。。。你松开了指向列表开头的指针!在调试运行中,Err为0(这也是混淆的);刚才我很困惑,当我评论“IF..THEN”和“END IF”时,代码工作正常,没有错误发生……???始终将指针派生的tyoe组件定义为
,pointer::next=>null()
非常感谢大家!将新分配的指针置为空可解决此问题!我非常感激!它帮助我学到很多东西