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检查