这取决于,但可能不是,具体取决于您的情况。如果您按照问题标签仅限于 Fortran 90,那么绝对不是以可移植的方式。
请注意,您的 Fortran 变量是一个 ALLOCATABLE。
正如您所问,它需要一个 Fortran 编译器(以及配套的 C 编译器)来实现最近发布的技术规范(TS 29113:2012)。您正处于该语言开发的前沿 - 目前支持此 TS 的编译器数量很少(如果不是零)。预计这个 TS 的内容将被纳入 Fortran 标准的下一个修订版中,所以几年后再试一次,你可能会有更好的运气。
但请注意,TS 限制了 C 为 Fortran 进行分配的方式 - 基本上 C 代码需要调用 Fortran 编译器提供的例程。您不能使用任何旧的分配器(包括 malloc),因此这仍然可能不适合。
然而,Fortran 2003 添加了在 C 中完成 Fortran POINTER 内存分配(不是您所要求的可分配)的可能性。C 代码返回一个指向适当大小的内存块的指针,Fortran 过程接收该内存块返回为 C_PTR 类型的对象。然后,Fortran 代码调用过程 C_F_POINTER 将 C_PTR 对象中的 C 地址与 Fortran 指针关联起来。 C_PTR 和 C_F_POINTER 是内部 ISO_C_BINDING 模块中的实体。
一个粗略的例子:
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_F_POINTER
INTERFACE
FUNCTION get_some_memory() BIND(C, NAME='get_some_memory')
IMPORT :: C_PTR
TYPE(C_PTR) :: get_some_memory
END FUNCTION get_some_memory
END INTERFACE
! REAL*4 isn't Fortran. Correct syntax below.
REAL(4), POINTER, DIMENSION(:,:,:) :: a1
! get_some_memory would typically be told how much memory was needed.
! n1, n2, n3 are integer with the relevant extents for each dimension.
CALL C_F_POINTER(get_some_memory(), a1, [n1,n2,n3])
! Equivalent call to free required at some later stage.
void *get_some_memory()
{
return malloc(some_number_of_bytes);
}
除此之外,您还可以使用一些依赖于处理器的(即不可移植的)技巧,但它们不属于标准语言的范围。