据我所知,除非在编译过程中有一个特殊的开关,并且这在所有编译器中都不存在(IBMXLF有这个开关,但我不记得了),否则不会对堆栈分配的数据进行初始化。
这意味着这些数组将充满随机垃圾。
无论如何,我强烈建议你
不
使用入口,除非你的生活依赖于它。在您展示它的过程中,我没有看到使用它的真正原因,除非预先设置状态,然后调用入口符号,但是有更好、更干净的选择。
如果你的意思是分配,那么它肯定是分配的。本代码
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
正如您所看到的,基本上是相同的(即,条目只是初始化部分的“复制”例程,然后在后面输出),实际分配发生在uuuu95_master_0中。_
___g95_master_0__:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $12372, %esp
call L8
当您看到堆栈指针递减时,您可以看到它在两个例程中都被调用。
当然,如果第一部分包含一个可分配变量和一个allocate,那么事情就会发生变化。在这种情况下,我不能肯定它不会被分配。你会撞车,但那是另一个问题。