Arrays 为什么这不会导致溢出错误?
这是一个简单的程序。当Arrays 为什么这不会导致溢出错误?,arrays,segmentation-fault,fortran,Arrays,Segmentation Fault,Fortran,这是一个简单的程序。当j>4时,我预期会出现错误,但是Fortan显示数组(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
j>4
时,我预期会出现错误,但是Fortan显示数组(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
您正在执行的操作超出了数组的边界。这不一定会超过堆栈的边界,而且对于这个小数组不太可能这样做。Fortran编译器生成的可执行文件通常不会检查非法的下标错误。原因是这样的检查会减慢程序的速度。您可以使用编译时选项请求此类检查。例如,对于gfortran,使用
-fcheck=all
或-fcheck=bounds
。使用ifort,-检查所有
或-检查边界
。“所有”选项包括“边界”选项和附加检查。使用g95编译-fbounds检查并运行
在文件xoverflow.f90(第6单元)的第18行
回溯:不可用,使用-ftrace=frame或-ftrace=full编译
Fortran运行时错误:数组元素超出边界:5英寸(1:4),dim=2
gfortran-fbounds检查给出了类似的结果。因此,您应该使用这些免费编译器以及至少-fbounds check和-Wall选项来测试代码。仅仅因为您没有在内存中分配特定的空间,并不意味着如果您尝试使用它,它将崩溃。它可能会也可能不会引起问题,这取决于具体情况。这被称为未定义的行为。甚至只是
-用ifort检查