Fortran 中分配的字符串数组的段错误

Segfault with allocated string array in Fortran

我试图遍历传递给 Fortran 程序的所有参数,参数的数量各不相同。因此,我使字符串数组可分配。

但是,一旦我开始所述循环,如果给出任何参数,我就会遇到段错误。

有一个可分配的字符串数组有什么问题吗?

代码:

program read_args

implicit none
character(len=999), allocatable :: args(:)
integer, allocatable :: i, nargs

nargs=command_argument_count()

if ( nargs == 0 ) then
    print*, 'err: no arguments or options'
    stop
end if

allocate(args(1:nargs))

print*, nargs, size(args(:))
do i=1,nargs
    call getarg(i,args(i))
    args(i)=trim(adjustl(args(i)))
end do

end program

打印了参数的数量和数组大小,一旦我尝试读取参数,我得到了一个段错误。

编译器,gfortran - gcc , v8.3.0debian 10

(为了避免 XY 问题:想法是检查参数列表中的选项标志以及获取应处理的所有文件名)

结果:

$ ./a.out
err: no arguments or options

$ ./a.out arg1 arg2
2  2
<Segfault>

如评论所述,此程序中的问题是在 do 构造中使用了未分配的变量 i,而不是在构造中使用字符数组。

我们可以确切地知道为什么 i 的这种使用是有问题的。

do i=1,nargs

我们知道 i 是 "do variable"(Fortran 2018,11.1.7.2)。在这样的 do 构造中,我们知道 (Fortran 2018, 11.1.7.4.1) 作为循环处理的一部分:

The DO variable becomes defined with the value of the initial parameter

那么,这个 "definition" 是否首先涉及 i 的分配?

没有。这与作为内部分配一部分的显式分配过程形成对比(例如有效的 nargs=command_argument_count())。 "becomes defined" 不允许 i 未分配(Fortran 2018,5.4.10):

An unallocated allocatable variable shall not be referenced or defined.

i 的定义与 i 具有初始参数的内部赋值目标不同。

一般来说,具有可分配的标量,例如 inargs 可能很有用,但在这个问题的情况下,情况并非如此:删除 allocatable 属性从他们那里不会改变逻辑。或者,可以在输入 do 结构之前显式分配 i(无需为其赋值)。