Fortran中的指针转换

Fortran中的指针转换,fortran,Fortran,为了与C编程语言的互操作性,我需要用Fortran强制转换指针。基本上,我喜欢用Fortran实现C语言中的以下功能: #包括 int main(int argc,字符**argv) { int n=100; 长ptr; ptr=(长)&n; printf(“ptr:%ld\n”,ptr); } (long为简单起见,应首选int_ptr_t)示例输出: ptr: 140737488349460 但是在Fortran中使用transfer()尝试同样的方法会导致不同的结果: program

为了与C编程语言的互操作性,我需要用Fortran强制转换指针。基本上,我喜欢用Fortran实现C语言中的以下功能:

#包括
int main(int argc,字符**argv)
{
int n=100;
长ptr;
ptr=(长)&n;
printf(“ptr:%ld\n”,ptr);
} 
long
为简单起见,应首选
int_ptr_t
)示例输出:

ptr: 140737488349460
但是在Fortran中使用
transfer()
尝试同样的方法会导致不同的结果:

program main
    implicit none
    integer, target :: n = 100
    integer(kind=8) :: ptr

    ptr = transfer(loc(n), ptr)
    print '(a, i0)', 'ptr: ', ptr
end program main
输出:

ptr: 6296120
还可以使用适当的ISO C绑定类型和函数,结果非常相同:

program main
    use, intrinsic :: iso_c_binding
    implicit none
    integer(kind=c_int), target :: n = 100
    integer(kind=c_intptr_t)    :: ptr

    ptr = transfer(c_loc(n), ptr)
    print '(a, i0)', 'ptr: ', ptr
end program main
为什么
loc(n)
/
c\u loc(n)
不返回类似的内存地址


(示例已使用GCC 9和GNU Fortran 9编译。)

Fortran仅在堆栈上存储可分配变量。因此,需要堆栈地址的变量必须声明为指针或可分配:

program main
    use, intrinsic :: iso_c_binding
    implicit none
    integer(kind=c_int), pointer :: n => null()
    integer(kind=c_intptr_t)     :: ptr

    allocate (n)
    n = 100
    ptr = transfer(c_loc(n), ptr)
    print '(a, i0)', 'ptr: ', ptr
end program main
结果:

ptr: 34366292000

如果您这样做是为了与C的互操作性,为什么不使用标准的互操作性功能呢?事实上,这没有什么区别。从编译这两个功能,并查看每个功能的
objdump-D
输出。。。在Fortran版本中,指针指向存储在
.data
部分中的值。在C版本中,指针指向已推送到堆栈上的值。Fortran和C可执行文件没有理由先验地将主程序的第一个整数存储在同一内存位置。也许你能解释一下你最终想要实现什么?也许如果你告诉我们你真正想要实现什么,我们也许能提供帮助。现在,您似乎只是提供内存地址,并声明它没有按您期望的方式工作。