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

Dart调用C FFI获取结构体时float指针与int值异常问题

Dart FFI调用C结构体字段异常问题

通过Dart基础FFI调用C语言获取结构体时,仅char*和int*字段能返回正确值,float*和int字段返回错误值。C端打印这两个异常字段的值正常,相关代码及输出如下:

C代码

// C code
typedef struct {
    float * floatPtr;
    int count;
    char * name;
    int * intPtr;
}baseStruct;


baseStruct getMyStruct(){
    static baseStruct myStruct;
    static int someint = 22;
    static float foo [] = {0.1, 0.2, 0.3};
   
    myStruct.floatPtr = foo;  
    myStruct.count = 0;
    myStruct.intPtr = &someint;
    myStruct.name = "some string";
    
    return myStruct;
}

Dart代码

// Dart Type for C struct
class MyStructType extends Struct {
  
  external Pointer<Float> floatPtr;
  @Int32()
  external int count;
  external Pointer<Int> intPtr; //worked 
  external Pointer<Utf8> name; //worked

}

// type defs for FFI
typedef GetMyStructNative = MyStructType Function();
typedef GetMyStruct = MyStructType Function();


// Code to call function from dynamic library 
static final getMyStruct  = module
.lookupFunction<GetMyStructNative, GetMyStruct>('getMyStruct');


// call native function and get native struct
MyStructType myStruct = getMyStruct();

输出结果

count: 475423 // 预期为0,错误
count: 22 // 正确
name: some string // 正确
floatPtr: [0.0, 0.0, 4.764414778704378e-44] // 预期为[0.1,0.2,0.3],错误

问题原因及解决方案

核心问题:结构体字段顺序不匹配

C结构体的字段定义顺序为:floatPtr → count → name → intPtr,但Dart的MyStructType字段顺序为:floatPtr → count → intPtr → name,两者顺序不一致。结构体在内存中是按定义顺序连续存储的,字段顺序不匹配会导致内存偏移错误,读取到错误的内存区域数据。

修复方法

调整Dart中MyStructType的字段顺序,与C结构体完全一致:

class MyStructType extends Struct {
  external Pointer<Float> floatPtr;
  @Int32()
  external int count;
  external Pointer<Utf8> name; // 调整到count之后
  external Pointer<Int> intPtr; // 调整到name之后
}

修复后,Dart结构体的内存布局将与C结构体完全对齐,即可正确读取所有字段的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:06:05