--- title: cdata - C 值与 FFI summary: LuaJIT 中用于指针、结构体和 C 数字的值。ffi.string 将 C 字符串复制为 Lua 字符串;ffi.cast 改变类型视图,但不能证明地址有效。内存生命周期必须单独确认。 section: reference kind: guide status: reference updated: 2026-10-26 tags: ["API","X4"] sources: ["https://wiki.egosoft.com/X4%20Foundations%20Wiki/Modding%20Support/","https://www.lua.org/manual/5.1/manual.html","https://luajit.org/ext_ffi_api.html"] --- ## 含义 LuaJIT 中用于指针、结构体和 C 数字的值。ffi.string 将 C 字符串复制为 Lua 字符串;ffi.cast 改变类型视图,但不能证明地址有效。内存生命周期必须单独确认。 ## 示例 ```lua local ffi = require("ffi") local value = ffi.new("uint64_t", 42) local kind = type(value) -- cdata local bytes = ffi.sizeof(value) ``` **运行效果:** 值为 uint64_t含有 42;类型 = "cdata";字节 = 8. 这段段没有打印或写日志信息. 显示的值是示例的预期结果. ## 方法与相关调用 | 函数 | 返回 | 用途 | | --- | --- | --- | | [ffi.cast](wiki:api-standard-ffi-cast-ae33ac09) | [`cdata`](wiki:type-cdata) | 通过C类型的成创建了 skalar cdata. 造不验证记忆地址. | | [ffi.cdef](wiki:api-standard-ffi-cdef-a564999c) | [`none`](wiki:type-results) | 声明FFI的C类型和签名;它不加载图书馆或实现函数. | | [ffi.copy](wiki:api-standard-ffi-copy-aa0e2705) | [`none`](wiki:type-results) | 复制字节到分配缓冲中. 输出长度需要一个Lua字符串,同时还复制其零终端符. | | [ffi.new](wiki:api-standard-ffi-new-86273c2d) | [`cdata`](wiki:type-cdata) | 分配和初始化cdata. 对于变长数组或结构,需要一个尺寸参数. | | [ffi.sizeof](wiki:api-standard-ffi-sizeof-18d93d2f) | [`number`](wiki:type-number) \| [`nil`](wiki:type-nil) | 返回C类型或cdata的字节大小;一个未知的大小可以产生零. | | [ffi.string](wiki:api-standard-ffi-string-4edf893f) | [`string`](wiki:type-string) | 复制从C指针中的数据到Lua字符串中;它没有长度,它读到零终端器. |