我有一个 Fortran 程序。子程序如下。程序在执行第1434行并打印以下内容后出现段错误:
i: 115 256 2
Segmentation fault (core dumped)
参数为 n1=258、n2=258 和 n3=258。号码=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
最佳答案
您的变量定义在数组 u
中为 46480 double
预留了存储空间(并且还为 v
和 预留了尽可能多的空间) r
.
您对 zero3()
的函数调用声称您传递的数组中有足够的存储空间,可存储 258*258*258 = 17173512 个 double 。
当它尝试访问超出实际数组边界足够远的元素时,程序会崩溃 - 您正在尝试访问未分配给程序的内存。
您需要将 nr
更改为较小的数字 (35*35*35 = 42875,因此 zero3(u, 35, 35, 35)
应该是安全(不会崩溃),或者您需要为 u
分配更多空间:
double u(258,258,258)
或者类似的东西(自从我上次写 Fortran 以来已经有一段时间了;当时的标准是 Fortran 77)。
关于arrays - 在fortran程序中访问数组时发生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326593/