bar
我不明白为什么如果该字段存在于SIGSEGV 中,则以下程序会出现段containerType
错误,并且如果将其注释掉则可以正常工作。我在 x86_64 上,同时使用 gfortran-4.4.6 和 gfortran-4.6.3 进行编译。
据我了解,使用指针containerType
应该强制包含的大数组的分配发生在堆上,但情况似乎并非如此。在可执行文件上运行valgrind
给了我
Warning: client switching stacks? SP change: 0x7ff000448 --> 0x7fe0603f8
to suppress, use: --max-stackframe=16384080 or greater
(输出的其余部分与恕我直言无关,但如果需要我可以编辑它)。这向我表明存在堆栈溢出;大概是由于在堆栈上分配了 8*8*8*4000 * 8(bytes per real) = 16384000 字节。
当我注释掉该bar
字段时,valgrind
非常高兴。更奇怪的是,在 gfortran-4.6.3 下使用 '-O' 编译也会使问题消失(但不是在 gfortran-4.4.6 下)。
要么我偶然发现了编译器错误,要么(更有可能,因为我对 Fortran 还很陌生)我不明白数据的分配位置。有人可以告诉我发生了什么吗?
有问题的代码:
main.f90:
program main
use problematicArray
implicit none
type (containerType),pointer :: container
allocate(container)
container%foo%arrayData = 17.0
write(*,*) container%foo%arrayData(7,7,7,100)
deallocate(container)
write(*,*) 'Program finished'
end program main
有问题的Array.f90:
module problematicArray
implicit none
private
integer, parameter, public :: dim1 = 4000
type, public :: typeWith4DArray
real(8), dimension(8,8,8,dim1) :: arrayData
end type typeWith4DArray
type :: typeWithChars
character(4), dimension(:), allocatable :: charData
end type typeWithChars
type, public :: containerType
type(typeWith4DArray) :: foo
type(typeWithChars) :: bar
end type containerType
end module problematicArray