3

Linux 64 ビットで、小規模なテスト プログラムが 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
4

1 に答える 1

4

これをテストしたところ、文字配列が大きすぎるとスタックが吹き飛ばされることがわかりました。割り当て可能な長さの文字列を使用し、それを「mylen」の先頭に割り当てると、ヒープに配置され、プログラムが動作します。

于 2013-08-21T03:42:52.297 に答える