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

如何在Kotlin/Native中向C传递int*并获取写入值?

Kotlin调用C函数通过int*指针获取返回值的正确实现

你需要把Kotlin的值以int*形式传给C函数,再读取C写入后的值,对应的C函数定义如下:

int readValue(long param, int *value);

函数返回1代表成功,0代表失败,实际读取的值通过value指针返回。你尝试用cValuesOf包装Int,但无法获取结果,错误代码如下:

import interop.readValue

fun doIt(): Boolean {
    val arg = cValuesOf(0) // 以为能得到CValue<Int>
    val result = readValue(42L, arg)
    
    if (result == 0) {
        return false
    } else {
        println("Read value: ${arg.value}") // 报错,没有arg.value属性
        return true
    }
}

正确实现方式

在Kotlin/Native里,处理C指针参数并获取修改后的值,必须用**内存作用域(memScoped)**来管理本地临时内存,避免内存泄漏。具体实现如下:

import interop.readValue
import kotlinx.cinterop.*

fun doIt(): Boolean = memScoped {
    // 分配一个可修改的Int变量,对应C的int*类型
    val valuePtr = alloc<IntVar>()
    // 可选:给变量设置初始值
    valuePtr.value = 0

    // 调用C函数,传递变量的指针(ptr属性)
    val result = readValue(42L, valuePtr.ptr)

    return if (result == 0) {
        false
    } else {
        // 读取C函数写入的值
        println("Read value: ${valuePtr.value}")
        true
    }
}

你的代码问题出在哪?

  • cValuesOf(0)创建的是不可变的临时C数组(类型为CValue<IntArray>),并不是单个可修改的int*指针。C函数没法修改这个数组的内容,而且它本身也没有value属性,自然读不到值。
  • 直接用cValuesOf不配合内存作用域,还可能引发内存安全问题,因为临时内存的生命周期不受控制。

另一种简化方式(不推荐)

如果不想用memScoped,也可以用pin()固定Kotlin变量的内存来获取指针,但必须手动释放固定,否则会内存泄漏:

import interop.readValue
import kotlinx.cinterop.*

fun doIt(): Boolean {
    var intValue = 0
    // 固定变量内存,获取指针
    val valuePtr = intValue.pin()

    // 调用C函数,传递指针地址
    val result = readValue(42L, valuePtr.addressOf(0))

    // 读取修改后的值
    val readValue = valuePtr[0]
    // 必须手动释放固定,否则内存泄漏
    valuePtr.unpin()

    return if (result == 0) {
        false
    } else {
        println("Read value: $readValue")
        true
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:10:28