【问题标题】:Converting UnsafeMutablePointer to an Array gives wrong value [duplicate]将 UnsafeMutablePointer 转换为数组会给出错误的值 [重复]
【发布时间】:2020-08-06 13:07:18
【问题描述】:

我正在使用 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)

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

但是当我将 tf2(UnsafeMutablePointer) 转换为数组时,

值不同。

我是这样转换的

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

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

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

转换后的值与 C 源中的返回值不正确。

我在这个问题上浪费了大约 10 天的时间......

我该怎么做.....?

【问题讨论】:

  • 您是否启用了所有编译器警告?您应该会看到类似“返回的与局部变量 'v1' 关联的堆栈内存地址”...
  • @MartinR 它与内存相关联。我没有学过'C',所以我不知道如果本地函数上设置的内存没有声明为动态的,则返回时将是空闲的。

标签: c swift bridging-header unsafemutablepointer


【解决方案1】:

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; 
}

但是,您必须在某些时候释放内存,否则您会出现内存泄漏。

【讨论】:

  • 你是对的。 Malloc是解决问题的关键。我没有学过'C',所以我不知道如果本地函数上设置的内存没有声明为动态的,则在返回时将是空闲的。谢谢!
猜你喜欢
  • 2019-12-08
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2018-08-01
相关资源
最近更新 更多