我有一个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
时,您的程序将在第一次迭代时崩溃,无法保证会发生什么,当然除了你的数据毫无意义之外。在你学生的计算机上,内存的安排使他在程序分配之外访问内存。在你的计算机上,这种情况没有发生。同样,也无法保证在数组边界之外会发生什么。它只是,“有蜜蜂龙!"