Malloc 分配数组时出错

Malloc 分配数组时出错,malloc,fortran,allocation,Malloc,Fortran,Allocation,我有一个子程序,在程序运行期间调用了很多次。我尝试使用尽可能多的可分配数组,子例程被调用了几次,没有任何问题,但在某个时候,它终止于: malloc.c:3790: _int_malloc: Assertion `(unsigned long)(size) >= (unsigned long)(nb)' failed. 当分配第一个数组时,这发生在子例程的开头 改为使用不可分配数组,子例程的调用次数会增加几倍,但会再次终止,现在为: wait: 28674: Memory fault(

我有一个子程序,在程序运行期间调用了很多次。我尝试使用尽可能多的可分配数组,子例程被调用了几次,没有任何问题,但在某个时候,它终止于:

malloc.c:3790: _int_malloc: Assertion `(unsigned long)(size) >= (unsigned long)(nb)' failed.
当分配第一个数组时,这发生在子例程的开头

改为使用不可分配数组,子例程的调用次数会增加几倍,但会再次终止,现在为:

 wait: 28674: Memory fault(coredump)
我假设它在调用时终止,因为我在声明变量之后立即写出一些值,而不进行任何计算。
召唤

do k=1, kreise
     write(*,*)k 

     call rundheit(n(k),kreis(k,1:n(k),3),kreis(k,1:n(k),2),outrnd)

end do
其中“kreise”的值可能高达1500。我打印并检查了调用前、子例程中和调用后传递的参数值

限制“kreise”确实解决了问题,但限制并不是一个实际的解决方案。我需要评估所有的数据。一点也没有

我的环境的一些注意事项:
我的程序是由FEM仿真软件使用英特尔Fortran编译器编译的子程序。据我所知,我没有机会修改编译器选项,也无法自己编译代码,因为它与FEM软件部署的子程序有很多依赖关系

我在另一个更小更简单的模拟上开发并运行了这个精确的子程序,没有任何问题。只要我不使用这个特殊的子例程,实际的“更大的”模拟运行也没有任何问题。(区别主要是节点密度,因此是计算过程中考虑的数据量)其他用户子例程工作没有问题。所有子程序所做的就是在不改变模拟的情况下,获取一些增量之间的结果,进行一些分析并编写一些报告

我猜这个问题与内存处理有关,这是我不知道的

谢谢

更新
我使用
-check all
编译了子例程,发现错误发生在错误子例程之前。有两个数组,其中一个是n(),在某些情况下是越界的,但是在调用时错误会变得更加严重。奇怪的是,当错误发生时,它是一些超出界限的迭代,例如:这里两个数组的大小都是
(1:72)
,调用在某个地方中断k=135到267(我在一些运行中发现的最低和最高值)

问题是整数
Kreise
,该值在循环过程中设置:

...
allocate(n(l))
allocate(pos(l))
...
do kreise = 1,l
   pos(kreise)=minvalX+(Kreise-1)*IncX
   if(pos(kreise).gt.maxvalX) exit
end do
其中
kreise
始终变为l+1。为什么?


注意:
pos(kreise).gt.maxvalX
永远不应为真。尽管它表明
l
的计算结果是错误的(大到)。这种退出只会通过减少几个循环的迭代来节省以后的计算时间

程序可能正在写入不应写入的内存,并破坏Fortran allocate使用的malloc内存管理结构。我建议使用Fortran选项进行运行时下标检查。使用ifort,尝试
-检查所有
-检查边界

恐怕这不容易。编译是由FEM软件管理的,看起来不可能更改编译器选项。是否有办法告诉编译器使用此选项作为默认选项?而不是在编译时设置它们?如果您在计算机上编译代码,必须有一种方法来更改编译器选项。特别是因为您可以添加自己的源代码。您使用的是什么特定软件包?MSc.Marc Mentat使用ifort 12.1编译器。我建议阅读他们的文档或联系他们的支持人员。