Fortran:成功创建指针数组后的SIGSEGV

时间:2018-09-04 19:50:53

标签: arrays pointers fortran

Fortran问题:我成功制作了一个指针数组,该指针指向对象数组中的元素

编译器为gcc/5.4.0

注意:

使用gcc/6.4.0解决了这个问题。

选项是:

>>gfortran -fdefault-real-8 -o H -fbacktrace -g -fcheck=all pointersToObjects.f90
>>./H

这是我的问题的照片 enter image description here

我的指针数组基于对Arrays of pointers的回答

我成功创建了数组,并且如果我在其中调用任何特定元素,它将给出正确的结果。但是,如果尝试遍历指针数组,则一旦达到指向第二个对象的值,就会遇到分段错误。

这很奇怪,因为如果我从对象2或3等中显式调用存储在指针数组中的值,它将输出正确的值。只有当我尝试遍历所有值时,它才会失败。

代码如下:

program pointers

type objects
    real, allocatable    :: array(:)
    character(10)        :: misc1=""
end type objects

type ptr
    real, pointer :: p
end type ptr

class(objects), allocatable, target  :: objectArray(:)
integer                              :: i, j, elem
type(ptr), allocatable               :: pointy(:)

allocate(objectArray(3))

do i = 1,3
    allocate(objectArray(i)%array(i+1))  ! arbitrary array length in each object,
enddo

allocate(pointy(9)) ! this is 2 + 3 + 4, dimeneions of each objectArray%array

elem = 0  ! dummy counter variable
do i = 1,3
    do j = 1,size(objectArray(i)%array)
        elem = elem + 1
        ! give dummy values to objectArray, then point to them with pointy
        objectArray(i)%array(j) = rand()
        pointy(elem)%p => objectArray(i)%array(j)
        print*,i,j, 'obj: ', objectArray(i)%array(j), 'pointer: ', pointy(elem)%p
    enddo
enddo

print*, 'size: ', size(pointy), elem, pointy(9)%p
print*, '========================='

do i = 1,size(pointy)
    print*, i, pointy(i)%p
enddo
end program pointers

,这是输出: enter image description here

1 个答案:

答案 0 :(得分:2)

Francescalus在评论中给出了答案。但要闭幕:

使用gcc/6.4.0而不是gcc/5.4.0可以解决此问题。