将UnsafeMutablePointer转换为一个数组,给出了错误的值[重复]。


我使用的是Swift,我是否应该使用C源与Bridging-Header。

C源代码有这样的功能。

char* testFunc2(char *input) { // input = [4, 5, 6, 7, 8, 9]
    char v1[17] = { 0, };

    memcpy(v1, input, 4);

    return (char*)v1; 
}

v1的值是[4, 5, 6, 7, 0, 0, 0…]。

我输入的数据是这样的

var i1: [Int8] = [4, 5, 6, 7, 8, 9]
let idPtr = UnsafeMutablePointer<Int8>.allocate(capacity: 7)
idPtr.initialize(from: &i1, count: 6)

let tf2 = testFunc2(idPtr)

tf2的地址值等于(char*)v1。

但是当我把tf2(UnsafeMutablePointer)转换为Array时。

值是不同的。

我是这样转换的

let tt2Buf = UnsafeMutableBufferPointer(start: tt2, count: 17)
let tt2Arr = Array(tt2Buf)

当我直接返回输入(参数)时,转换后的值是正确的。

但是当我在C源中做了一些事情并返回值时。

转换后的值与C源的返回值不一致。

我在这个问题上浪费了10天时间……。

我该怎么做……?

解决方案:

char v1[17] 是本地数组,其作用范围仅限于 testFunc2 函数,你不能在函数外使用它的引用。你不能在函数外使用它的引用。

也许你可以动态地分配内存并传递它的引用。

char* testFunc2(char *input) { // input = [4, 5, 6, 7, 8, 9]
    char *v1 = malloc(17);

    memset(v1, 0, 17);
    memcpy(v1, input, 4);

    return v1; 
}

然而你必须在某些时候释放内存,否则你会有内存泄漏。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

如何在POSTMAN中发送POST变量?

2022-5-11 4:00:12

解决方案

在python dict中循环改变键值[重复]。

2022-5-11 4:00:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索