为什么这不会导致溢出错误?

时间:2014-05-22 03:41:17

标签: arrays segmentation-fault fortran

这是一个简单的程序。我预计在j>4时会出错,但Fortan会显示array(2,5)=0.0。如果它给我一个堆栈溢出错误会更有用。

你有什么看法?

program main 

implicit none

integer,parameter :: n=2,z=4
!real, dimension(1:2,1:4) :: array
real,allocatable ::  array(:,:)
integer :: i,j

allocate(array(n,z))
array = 0.0
array(1,1)=1.0 ; array(1,2)=2.0 ; array(1,3)=3.0 ; array(1,4)=4.0
array(2,1)=5.0 ; array(2,2)=6.0 ; array(2,3)=7.0 ; array(2,4)=8.0

do j=1,5
    do i=1,2
        write(*,*) i,j
    write(*,*) array(i,j)
    enddo
enddo

end program main

2 个答案:

答案 0 :(得分:4)

您正在做的是超出数组的范围。这不一定会超过堆栈的边界,并且不太可能使用这个小数组。 Fortran编译器生成的可执行文件通常不检查非法下标错误。原因是这样的检查会减慢程序的速度。您可以使用编译时选项请求此类检查。例如,使用gfortran使用-fcheck=all-fcheck=bounds。使用ifort,-check all-check bounds。 “所有”选项包括“边界”选项和其他检查。

答案 1 :(得分:1)

使用g95 -fbounds-check进行编译并运行

文件xoverflow.f90第18行(第6单元) 回溯:不可用,使用-ftrace = frame或-ftrace = full进行编译 Fortran运行时错误:数组元素超出范围:5英寸(1:4),dim = 2

和gfortran -fbounds-check给出了类似的结果。因此,您应该使用这些免费编译器以及至少选项-fbounds-check和-Wall来测试您的代码。