该标准说(第 6.3.3.2 节):
...解除分配指针目标会导致与目标或目标的一部分关联的任何其他指针的指针关联状态变为未定义。
此外,在第 16.4.2.1 节中,它说:
指针可能具有关联、解除关联或未定义的指针关联状态。
在注释 16.3 中指出:
来自模块程序单元的指针可以通过使用关联在子程序中访问。此类指针的生命周期大于子程序中声明的目标,除非保存此类目标。因此,如果这样的指针与本地目标相关联,则当子程序定义的过程完成执行时,目标可能会不复存在,从而使指针“悬空”。本标准认为此类指针具有未定义的关联状态。它们既没有关联也没有分离。在重新建立其状态之前,不得在计划中再次使用它们。不要求处理器能够检测指针目标何时停止存在。
所有这一切都是说.TRUE.
您从英特尔获得的结果是特定于编译器的,因为c
具有未定义的关联状态,编译器可以以他们想要的任何方式报告。如果你试图通过 访问a
,c
你会得到一个内存错误(或者即使它有效,它是未定义的并且不是保证)。
同样,您的示例函数同样危险,因为无法保证var
函数返回时会存在,这意味着ptr
函数结果再次未定义。同样,如果您尝试var
通过 的结果进行访问ptr
,您将再次遇到内存错误。
如果您希望您的功能正常工作,它需要如下所示:
function ptr
real, pointer, save :: var
real,pointer :: ptr
allocate(var)
ptr=>var
end function
Of course, this begs the ultimate question -- why ALLOCATE
pointers? It's much safer to use ALLOCATABLE
for the target and give it the TARGET
attribute.