将 UnsafeMutablePointer 转换为数组会给出错误的值
Converting UnsafeMutablePointer to an Array gives wrong value
我正在使用 Swift,我应该使用带桥接头的 C 源代码吗?
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)
地址值等于(char*)v1与tf2。
但是当我将 tf2(UnsafeMutablePointer) 转换为数组时,
数值不同
我是这样转换的
let tt2Buf = UnsafeMutableBufferPointer(start: tt2, count: 17)
let tt2Arr = Array(tt2Buf)
当我return直接输入(参数)时,转换后的值是正确的。
但是当我在 C 源代码中做了一些事情并且 returned 值时,
转换后的值与 C 源代码中的 return 值不正确。
我在这个问题上浪费了大约 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;
}
但是你必须在某个时候释放内存,否则你会发生内存泄漏。
我正在使用 Swift,我应该使用带桥接头的 C 源代码吗?
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)
地址值等于(char*)v1与tf2。
但是当我将 tf2(UnsafeMutablePointer) 转换为数组时,
数值不同
我是这样转换的
let tt2Buf = UnsafeMutableBufferPointer(start: tt2, count: 17)
let tt2Arr = Array(tt2Buf)
当我return直接输入(参数)时,转换后的值是正确的。
但是当我在 C 源代码中做了一些事情并且 returned 值时,
转换后的值与 C 源代码中的 return 值不正确。
我在这个问题上浪费了大约 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;
}
但是你必须在某个时候释放内存,否则你会发生内存泄漏。