Fortran 指针赋值,“=>”和“=”的区别

Pet*_*ter 1 fortran pointers

我努力理解的不同的行为=>=使用Fortran 95即分配一个指针到另一个时说,我有一个导出数据类型foo,那么,什么是在下面的代码片段,它们是等价的最后两行之间的区别?

type(foo), target :: f
type(foo), pointer :: p1, p2

f = foo(...)
p1 => foo

p2 => p1
p2 = p1
Run Code Online (Sandbox Code Playgroud)

Vla*_*r F 5

不,它们绝对不是等价的,并且误认为它们会产生很大的后果(例如Fortran 函数中的指针导致正常赋值)。

=赋值(或者只是赋值,如果你想准确的话),它将获取存储在右侧的值并将其复制到左侧。如果左侧是一个指针,它会将值复制到指针的目标。如果指针没有指向任何地方(空)或某个未定义的地方(垃圾地址),这是一个未定义的行为,但很可能发生崩溃。

=>指针赋值,左侧必须是指针,右侧必须是目标或指针。左侧的指针将指向右侧的目标(或指针的目标)。如果左侧的指针已经指向某个内存,该内存之前是allocate通过指针由语句分配的,并且它是唯一指向那里的指针,则该内存将丢失(内存泄漏)。