Поле .top как раз инициализируется:
NEW(v.top)

Но в процедуре Sea объявлена переменная
VAR c: Field
Ее начальное значение - NIL, оно гарантируется языком. Затем
m.top := c;  (* теперь m.top = NIL *)
c.i := 1024;  (* теперь аварийный останов: разыменование пустого указателя, т.к. c = NIL *)

Я не уверен, но, возможно, вы хотели написать
c := m.top
а написали m.top := c
Тогда по окончании работы процедуры Sea будет справедливо
m.top.i = 1024
(И, кстати, это называется постусловием процедуры Sea)