Насколько я знаю, при распределении данных в стеке инициализация не происходит, если у вас нет специального переключателя во время компиляции, и он существует не во всех компиляторах (у IBM xlf есть, но я его не помню).
Это означает, что эти массивы будут заполнены случайным мусором.
В любом случае, я настоятельно рекомендую вам , а не использовать ENTRY, если ваша жизнь не зависит от этого. Как вы представляете, я не вижу смысла использовать его, кроме как предварительно установить состояние и затем вызвать символ ENTRY, но есть гораздо лучшие, более чистые альтернативы.
Если вы имеете в виду выделенное, то это определенно так. Этот код
program hello
call bar
end
SUBROUTINE foo
character A(12345)
a(1) = "hello"
ENTRY bar
print *, a(1)
RETURN
END
компилируется в этот код (длинный материал)
.globl _bar_
_bar_:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -8(%ebp)
movl $1, -4(%ebp)
subl $4, %esp
pushl $0
leal -12(%ebp), %eax
pushl %eax
leal -4(%ebp), %eax
pushl %eax
call ___g95_master_0__
addl $16, %esp
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
leave
ret
.globl _foo_
_foo_:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -8(%ebp)
movl $0, -4(%ebp)
subl $4, %esp
pushl $0
leal -12(%ebp), %eax
pushl %eax
leal -4(%ebp), %eax
pushl %eax
call ___g95_master_0__
addl $16, %esp
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
leave
ret
Что, как вы можете видеть, в основном одно и то же (а именно, ENTRY - это просто "скопированные" подпрограммы для части инициализации, а затем разветвленные), фактическое распределение происходит в ___ g95_master_0_
___g95_master_0__:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $12372, %esp
call L8
Где вы видите, что указатель стека уменьшен, и вы можете видеть, что он вызывается в обеих подпрограммах.
Конечно, если ваша первая часть содержит переменную ALLOCATABLE и ALLOCATE, то все изменится. в этом случае я уверен, что он не будет выделен. и у вас будет сбой, но это другой вопрос.