我在这里得到的一些测试代码并没有像我怀疑的那样。我正在使用gfortran编译器。
program test
implicit none
integer, allocatable, dimension(:) :: a
integer, allocatable, dimension(:) :: b
allocate(a(2))
allocate(b(4))
a = 1
b = 2
write(*,*) a
write(*,*) ' '
write(*,*) b
write(*,*) ' '
write(*,*) 'a size before', size(a)
a = b
a = 1
write(*,*) a
write(*,*) ' '
write(*,*) b
write(*,*) ' '
write(*,*) 'a size after', size(a)
end program test
我得到以下输出。
1 1
2 2 2 2
2之前的大小
1 1 1 1
2 2 2 2
4之后的大小
为什么在分配不同尺寸的数组时没有出错? 为什么改变了大小?
答案 0 :(得分:6)
这是一项名为allocation on assignment的功能。将数组分配给可分配数组时,会自动调整大小。因此,在a = b
之后,a
的大小应为b
。
您可以通过-Wrealloc-lhs
选项告诉编译器发出警告。
另见这名男子参赛作品:
-frealloc-LHS
内在赋值的可分配左侧是 如果未分配或具有a,则自动(重新)分配 不同的形状。默认情况下启用该选项,除非
-std=f95
被给予。另请参阅-Wrealloc-lhs
。
另请参阅Steve Lionel撰写的相关博客文章Doctor, it hurts when I do this。