具有大型数组件的Fortran派生数据类型中的分段错误

时间:2017-03-02 20:10:04

标签: segmentation-fault fortran gfortran

当ND很大(1000000)时,有人可以解释为什么以下代码会产生分段错误吗?增加堆栈限制无济于事。

module parametros_mod
  integer, parameter :: ND = 1000000
end module parametros_mod

module data_mod
  use parametros_mod
  implicit none
  private

  type, public :: data_vec
    real(8) :: f0
    real(8), dimension(ND) :: fvec
  end type data_vec
end module data_mod

!test program
program test
  use parametros_mod
  use data_mod
  implicit none

  type(data_vec) :: v1
  real(8), dimension(ND) :: rv, xv

  rv = 0d0
  rv(2) = 1d0

  v1 = data_vec(1.1d0,rv)
  xv = v1%fvec
  write(*,'(*(f0.4,2x))') xv(1:3)
end program test

1 个答案:

答案 0 :(得分:1)

我复制了你的错误,但我不得不使用更大的ND。这真的是行

v1 = data_vec(1.1d0,rv)

可能在堆栈上创建了一个临时对象。

您可以通过分配组件来避免这种情况

v1%f0 = 1.1d0
v1%fvec = rv