Gfortran:具有长字符的分段错误

时间:2013-08-20 14:00:43

标签: segmentation-fault fortran character gfortran

一个小型测试程序在linux 64bit上使用gfortran(4.4.5)返回分段错误。 n = 2_8 ** 22_8时不存在故障。 Gdb表示在循环的第一次迭代期间,函数mylen中发生了分段错误。

allocate, stat=           0
size :              8388608
len, switch=false :              8388608
Segmentation fault

由于

function mylen(abc,n, switch) 

implicit none

logical, intent(in) :: switch
integer(kind=8), intent(in) :: n
logical, dimension(1:n), intent(in) :: abc
integer(kind=8) :: mylen
character(len=size(abc,dim=1,kind=8)) :: tmp
integer(kind=8) :: i

mylen=len(tmp,kind=8)
if (switch) then
  do i=1,len(tmp,kind=8)
    tmp(i:i)='a'
  enddo
endif

end function mylen

program test

implicit none

integer(kind=8) :: n
logical, allocatable :: abc(:)
integer(kind=8) :: mylen
integer :: ierr

n=2_8**23_8
allocate(abc(n),stat=ierr)
print *,'allocate, stat=',ierr
print *,'size :', size(abc,dim=1,kind=8)
print *,'len, switch=false :', mylen(abc,n,.false.)
print *,'len, switch=true  :', mylen(abc,n,.true.)

end program test

1 个答案:

答案 0 :(得分:4)

我对此进行了测试,并意识到如果字符数组太大,则会将堆栈吹掉。如果你使用一个可分配的长度字符串并在“mylen”的顶部分配它,那么它会在堆上运行。程序可以运行。