Назначение указателя Фортрана, разница между "=>" и "=" - PullRequest
1 голос
/ 09 апреля 2020

Я изо всех сил пытаюсь понять различное поведение => и = при назначении одного указателя другому в Fortran 95. То есть, у меня есть производный тип данных foo, в чем тогда разница между двумя последними строки в следующем фрагменте, они эквивалентны?

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

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

p2 => p1
p2 = p1

1 Ответ

5 голосов
/ 09 апреля 2020

Нет, они абсолютно не эквивалентны, и их ошибка имеет большие последствия (например, Функции Фортрана с указателем приводят к обычному присваиванию ).

= - это присваивание значения (или просто присваивание, если вы хотите быть точным), оно возьмет значение, сохраненное с правой стороны, и скопирует его с левой стороны. Если левая часть является указателем, она скопирует значение в указатель цели. Если указатель нигде не указывал (ноль) или некое неопределенное место (адрес мусора), это ненадлежащее поведение, но вполне вероятно cra sh.

=> - это назначение указателя , левая сторона должна быть указателем, правая сторона должна быть целью или указателем. Указатель с левой стороны будет указывать на цель (или цель указателя) с правой стороны. Если указатель слева уже указывал на некоторую память, которая ранее была выделена оператором allocate через указатель, и это был единственный указатель, указывающий на это, то память будет потеряна (утечка памяти).

...