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
相关产品推荐
相关产品推荐

