如何使用 iso_c_binding 声明指针中的指针?

How to declare pointer-of-pointer using iso_c_binding?

我正在用 Fortran 编写 iso_c_binding 来调用具有以下原型的 C 函数

int zmat_run(
    const size_t inputsize,
    unsigned char *inputstr, 
    size_t *outputsize, 
    unsigned char **outputbuf,
    const int zipid, 
    int *ret, 
    const int iscompress
);

我的问题是如何在此接口中声明 unsigned char **outputbuf,一个在 c 函数内部用于分配输出缓冲区的指针?

此外,我应该在 Fortran 中使用哪种数据类型作为传递给此 outputbuf 参数的实际参数?它应该是可分配的吗? (如果它是在 c 函数内部分配的)?

我目前正在起草此模块,但尚未对其进行测试(我怀疑它是否会起作用)。

module zmatlib
  use iso_c_binding, only: c_char, c_size_t, c_ptr, C_NULL_CHAR
  interface
    integer(c_int) function zmat_run(inputsize, inputbuf, outputsize, outputbuf, zipid, ret, level) bind(C, name="zmat_run")
      use iso_c_binding
      integer(c_size_t), value :: inputsize
      integer(c_int), value :: zipid, level
      integer(c_size_t),  intent(out) :: outputsize
      integer(c_int),  intent(out) :: ret
      character(kind=c_char),  intent(in)  :: inputbuf(*)
      character pointer(c_ptr),intent(out) :: outputbuf
    end function zmat_run
  end interface
end module

尝试键入 (C_PTR)、意图 (out)。然后您将需要使用 Fortran 函数 c_f_pointer 将 C 指针与 Fortran 指针相关联。可能是类型 C_CHAR.