Flutter FFI:如何从变量获取指针(类似C语言&操作)
在Dart中实现C风格指针操作的可行方案
可以通过Dart的dart:ffi库实现类似C语言的指针操作,以下是具体实现方式:
方式一:分配原生内存模拟指针
这种方式完全模拟C中在堆上分配变量并获取指针的行为:
import 'dart:ffi' as ffi; void main() { // 分配一块对应C int类型的原生内存(等价于C的int v;) final ffi.Pointer<ffi.Int32> p = ffi.allocate<ffi.Int32>(); // 给指针指向的内存赋值(等价于*p = 42;) p.value = 42; // 读取指针指向的值(等价于int v = *p;) int v = p.value; print(v); // 输出42 // 必须手动释放原生内存,避免泄漏(等价于free(p);) ffi.free(p); }
方式二:通过TypedData获取底层指针
如果要操作Dart中已有的连续内存数据(比如列表),可以通过TypedData获取其底层原生指针:
import 'dart:ffi' as ffi; import 'dart:typed_data'; void main() { // 创建一个单元素的Int32列表,等价于C的int v = 100; final intList = Int32List(1)..[0] = 100; // 获取列表第一个元素的指针,等价于int* p = &v; final ffi.Pointer<ffi.Int32> p = intList.elementAt(0).address; // 读取指针值 print(p.value); // 输出100 // 修改指针指向的内存,列表的值会同步变化 p.value = 200; print(intList[0]); // 输出200 }
注意事项
- Dart是托管语言,普通的Dart对象(比如直接定义的
int v = 10;)无法直接获取指针,因为它们存储在Dart的托管堆中,地址可能被GC移动。 - 手动分配的原生内存必须调用
ffi.free()释放,否则会造成内存泄漏;而TypedData的指针由Dart的GC管理,无需手动释放,但列表被回收后指针会失效。
内容的提问来源于stack exchange,提问作者Maya Amor
相关产品推荐
相关产品推荐

