面试题答案
一键面试以下是实现代码:
program reallocate_memory
implicit none
integer, pointer :: my_ptr(:)
integer :: new_size, i
! 初始分配内存
new_size = 5
allocate(my_ptr(new_size))
do i = 1, new_size
my_ptr(i) = i
end do
! 新的条件,新的大小
new_size = 10
! 重新分配内存前检查指针是否已分配内存
if (associated(my_ptr)) then
! 释放旧内存
deallocate(my_ptr)
end if
! 重新分配内存
allocate(my_ptr(new_size))
do i = 1, new_size
my_ptr(i) = i
end do
! 输出结果验证
do i = 1, new_size
print *, my_ptr(i)
end do
! 程序结束前释放内存
if (associated(my_ptr)) then
deallocate(my_ptr)
end if
end program reallocate_memory
检查指针是否已经分配内存的原因:
如果不检查指针是否已经分配内存就直接尝试释放它,会导致程序运行时错误,因为释放一个未分配的指针是未定义行为。在 Fortran 中,deallocate
一个未分配的指针会引发错误,可能导致程序崩溃。
如何检查:
在 Fortran 中,可以使用 associated
函数来检查指针是否已经分配内存。associated(pointer_variable)
函数会返回一个逻辑值,如果指针已经分配内存(即与某个内存对象相关联)则返回 .true.
,否则返回 .false.
。在上面的代码中,if (associated(my_ptr))
语句就是用来检查 my_ptr
指针是否已经分配内存,以便安全地进行内存释放操作。