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

C-Fortran互操作:struct中char指针数组的可移植绑定实现方案

问题核心原因

你之前的映射存在偏差的核心是对C类型的理解错误:char *foo[4]是元素为char*类型的长度为4的指针数组,不是长度为4的char数组。你之前用c_int映射只是当前环境下的巧合(32位系统或特定内存模型下c_int长度和指针长度刚好一致),换到64位环境(指针长度8字节)会直接内存偏移错误,完全不具备可移植性。


正确可移植的实现方案

按照Fortran C互操作标准,直接用iso_c_binding内置的c_ptr类型匹配C侧的指针即可,修改后的结构体声明如下:

type, bind(c), public :: frame
  ! 4个c_ptr元素对应C侧4个char*指针,自动匹配平台指针大小、对齐规则
  type(c_ptr), dimension(4) :: foo
  integer(kind=c_int) :: bar
end type frame

方案优势

  • 完全符合Fortran 2003及以上版本的C互操作规范,所有支持iso_c_binding的编译器(gfortran、ifort、nvfortran等)都兼容
  • 跨架构自适应:不管是32位系统(指针4字节)还是64位系统(指针8字节),c_ptr的内存属性都会自动匹配当前平台的C指针,保证结构体内存布局和C侧完全一致,不会出现bar偏移错误的问题
  • 扩展性好:如果后续需要读取foo指向的字符串内容,可以直接用c_f_pointer将c_ptr转为Fortran字符指针处理,不需要再修改结构体定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:15:04