我目前遇到内存问题:我有一个用 Fortran 编码的主程序,它调用 C/C++ 子例程来执行一些任务并将数据存储在动态分配的数组中。问题是我需要在返回 Fortran 主程序时访问这些数据。我试图在 fortran 中声明一个 C 指针 (TYPE(C_PTR)) 以指向该数组,但它似乎不起作用。该数组存在于 C 子例程中,但是当我回到主 Fortran 程序时尝试访问它时出现段错误。我在这里给出我的代码,有什么想法吗?感谢您的帮助 !!
Fortran:
PROGRAM FORT_C
use iso_c_binding
IMPLICIT NONE
interface
subroutine call_fc(pX,s) bind(C,name='call_fc_')
import
integer(c_int) :: s
type(c_ptr), pointer :: pX
end subroutine
end interface
integer(c_int) :: i
integer(c_int) :: s
integer(c_int), pointer :: X(:)
type(C_ptr), pointer :: pX
s=100
call call_fc(pX,s)
call c_f_pointer(pX,X,(/s/))
! This here provocates a segfault
do i=1,s
write(*,*), i
write(*,*) X(i)
end do
END
C 子程序:
#include <iostream>
#include <cstdlib>
using namespace std;
extern "C"
{
void call_fc_(int **x, int *s);
void c_func_deallocate(int **x);
}
void call_fc_(int **x, int *s)
{
int *y = (int *) malloc(sizeof(int)*(*s));
for(int i=0; i < *s+10; i++)
{
cout << i << endl;
y[i]=i;
}
*x = y;
}
void c_func_deallocate(int **x)
{
free(*x);
}
输出:
1
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
exemple 0000000000402E1F Unknown Unknown Unknown
exemple 0000000000402C8C Unknown Unknown Unknown
libc.so.6 000000331241ECDD Unknown Unknown Unknown
exemple 0000000000402B89 Unknown Unknown Unknown