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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:20:29