我有一个Fortran程序,它应该给出分段错误,但它没有';T

我有一个Fortran程序,它应该给出分段错误,但它没有';T,fortran,segmentation-fault,Fortran,Segmentation Fault,就像标题一样简单。我有一个学生有一个分段错误,我试图向他证明为什么会发生这种情况。相反,我最终想知道为什么没有 代码如下: program main implicit none

就像标题一样简单。我有一个学生有一个分段错误,我试图向他证明为什么会发生这种情况。相反,我最终想知道为什么没有

代码如下:

program main                                                                                 
  implicit none                                                                              
  real*8, allocatable:: u(:)                                                                 
  integer :: i                                                                               
  allocate(u(2))                                                                             


  do i=0, 1000                                                                               
     u(i) = i                                                                                
     print *, u(i)                                                                           

  enddo                                                                                      

end program main

我希望它在
I=3时崩溃,但事实并非如此。使用ifort和gfortran编译,使用-O0到-O3

如何打开边界检查选项进行编译,然后向学生解释,当边界检查的额外开销不到位时,seg错误是越界访问的常见结果?

为什么应该给出分段错误?您尚未编写有效的Fortran程序,因此无法真正预期会发生任何特定行为。也就是说,它可能崩溃(由于分段错误),也可能不崩溃,这取决于程序本身未确定的任何数量的因素。您的程序可以只打印“Hello”,并且仍然由符合要求的Fortran编译器生成“如果您编写的代码使用140个元素访问数组的元素141,Fortran与许多其他编译语言一样,将很高兴访问元素140之后的内存中的下一个位置。一般来说,您不知道程序正在干扰哪些数据。如果幸运的话,内存中的下一个位置在操作系统分配给程序的地址空间之外,操作系统会立即停止该程序并报告分段错误。“最有可能的情况是,即使您只分配
u(2),操作系统也会给程序提供大量堆存储
。一般来说,当您的程序到达此空间之外时,您的程序将发生故障。这发生在我的计算机上的
i=15095
时,但这不是您应该依赖的。如果您使用
-fsanize=address
进行编译,一旦超出和数组边界,当
i=0
时,您的程序将在第一次迭代时崩溃,无法保证会发生什么,当然除了你的数据毫无意义之外。在你学生的计算机上,内存的安排使他在程序分配之外访问内存。在你的计算机上,这种情况没有发生。同样,也无法保证在数组边界之外会发生什么。它只是,“有蜜蜂龙!"