You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran与C通过ISO_C_BINDING传递字符串无法接收返回值求助

问题根因

你遇到的问题核心是C和Fortran的字符串类型、指针类型不匹配,接口声明完全错误:

  • C的foo2返回值是char*(指向字符串首地址的指针),但你在Fortran接口里将它声明为长度为1的单个字符,本质上只拿到了指针地址截断后的第一个字符,自然无法获取完整字符串。
  • Fortran不能直接将C的指针赋值给内置字符串变量,需要做显式的类型转换,还要处理C字符串以\0结尾、Fortran字符串固定长度的差异。
  • 补充:你对foo函数的接口声明也存在隐患,声明为单个字符参数却传入字符串,只是因为Fortran默认传参用地址才碰巧跑通,不符合规范。

修改方案

1. 修正Fortran代码

program main
    use iso_c_binding
    implicit none
    character (len=100) :: string
    type(c_ptr) :: c_str_ptr
    character(kind=c_char), pointer :: f_char_arr(:)
    integer :: i, str_len
    interface
        ! 修正返回值为C指针类型
        type(c_ptr) function foo2() bind(c,name='foo2')
            use iso_c_binding
            implicit none
        end function foo2
        ! 修正输入为字符数组,匹配C的char*
        subroutine foo(input) bind(c,name='foo')
            use iso_c_binding
            implicit none
            character (kind=c_char), intent(in) :: input(*)
        end subroutine foo
    end interface

    write(*,'(A)') "In fortran now."
    string = "msg from fortran!"//c_null_char ! 传给C的字符串要加\0终止符,避免乱码
    write(*,'(A)') "In fortran again."
    call foo(trim(string))

    ! 接收C返回的指针,转换为Fortran字符指针
    c_str_ptr = foo2()
    call c_f_pointer(c_str_ptr, f_char_arr, [len(string)])

    ! 逐字符复制直到遇到C的字符串终止符\0
    string = ''
    do i = 1, len(string)
        if (f_char_arr(i) == c_null_char) exit
        string(i:i) = f_char_arr(i)
    end do

    write(*,'(A)') trim(string)
end program main

2. 修正Makefile隐患

你原来的OBJ规则写错了,$(SRCH:.h=.o)是把.h后缀替换为.o,但你的C源文件是.c后缀,修改为:

#makefile
FC=gfortran
CC=gcc
FFLAGS=-O3 -Wall -Wextra
SRC=main.f90
SRCC=test.c
OBJ=${SRC:.f90=.o} $(SRCC:.c=.o)
TARGET=out

$(TARGET): $(OBJ)
	$(FC) $(FFLAGS) -o $@ $(OBJ)
%.o: %.c
	$(CC) -o $@ -c $<
%.o: %.f90
	$(FC) $(FFLAGS) -o $@ -c $<

clean:
	rm *.o *.mod $(TARGET)

运行说明

修改后重新编译运行,就能输出你预期的msg from C!。注意如果你的C代码返回的是malloc分配的字符串,用完后需要手动调用C的free释放内存避免泄漏,本示例中返回的是静态字符串常量不需要释放。

内容的提问来源于stack exchange,提问作者boardkeystown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:42:01