2

我有一个 fortran 程序。子程序如下。程序在执行第 1434 行并打印以下内容后给出分段错误:

i:          115           256             2
Segmentation fault (core dumped)

参数为n1=258、n2=258、n3=258。NR=46480。为什么会发生分段错误?

75       double precision u(nr),v(nv),r(nr),a(0:3),c(0:3)
76       common /noautom/ u,v,r
......
196       call zero3(u,n1,n2,n3)
......
1418       subroutine zero3(z,n1,n2,n3)
1419 
1420 c---------------------------------------------------------------------
1421 c---------------------------------------------------------------------
1422 
1423       implicit none
1424 
1425 
1426       integer n1, n2, n3
1427       double precision z(n1,n2,n3)
1428       integer i1, i2, i3
1429 
1430 !$omp parallel do default(shared) private(i1,i2,i3)
1431       do  i3=1,n3
1432          do  i2=1,n2
1433             do  i1=1,n1
1434                print*,"i: ",i1, " ", i2 , " " ,i3
1435                z(i1,i2,i3)=0.0D0
1436             enddo
1437          enddo
1438       enddo
1439 
1440       return
1441       end
4

1 回答 1

2

double您的变量定义为数组中的 46480 留出了存储空间u(并且还为vand留出了尽可能多的空间r

您的函数调用zero3()声称在您传递的数组中有足够的存储空间用于 258*258*258 = 17173512 双打。

当它试图访问一个超出实际数组边界足够远的元素时,程序就会崩溃——您正在尝试访问未分配给程序的内存。

要么您需要更改nr为较小的数字(35*35*35 = 42875,因此zero3(u, 35, 35, 35)应该是安全的(不崩溃),或者您需要为以下内容分配更多空间u

double u(258,258,258)

或类似的东西(我上次写 Fortran 已经有一段时间了;当时的标准是 Fortran 77)。

于 2013-08-20T12:25:39.147 回答