回 帖 发 新 帖 刷新版面

主题:自动数组

今天运行一个程序,把一些数组的维数增大之后会出现“Segmentation fault”,于是回头补充一下基础,惭愧啊[em54]

采用动态数组可以减小程序对于内存的占用,包括可分配数组和自动数组。
subroutine fun(num, dim)
real(8)   :: num(dim,10000)
...
end subroutine

上面数组num是一个自动数组,程序结束时会自动释放内存。那么如果该子程序fun中num的定义为如下:
real(8)   :: num(large,10000)
而large是一个在该子程序外部定义的整数,那么数组num应该不是一个自动数组了吧?

回复列表 (共3个回复)

沙发

难道num(large,10000)程序运行完还在内存里么

ps:自动数组简单来说是没被初始化的数组(注:是初始化而不是赋值)。

板凳

large 必须是虚参中的一个变量。也就是你必须告诉子程序,large 的确定数值。

其次,楼主对地址传递似乎理解得不对。

地址传递和值传递不同。

值传递把所有数值(dim*10000个数据)压入堆栈,然后在子程序结束时调整栈顶进行重新利用(并不弹出,也无所谓自动释放)。

而地址传递只压入4字节进入堆栈,这4字节代表该数组所在内存的地址。所以数组的大小就是该地址之后的 dim*10000 个位置。
此时,子程序并不对数组进行任何初始化和赋值。这些操作是由调用它的程序单元完成的。

3 楼


受教了,多谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册