正确的呼叫方式" realloc"在Swift中使用Float数组?

时间:2014-07-27 12:48:27

标签: swift realloc

我正在尝试找出要发送的尺寸" realloc"当我通过Swift调用它时。 似乎我必须添加一个额外的字节,但我不明白为什么。

typealias Floats = UnsafeMutablePointer<Float>

let FLOAT_SIZE = sizeof( Float )

func floats_realloc( floats:Floats, qty_of_floats:Int ) -> Floats  {

     let KLUDGE = 1 // Why?

     let qty_of_bytes = ( qty_of_floats * FLOAT_SIZE ) + KLUDGE

     let realloced_floats = Floats(

          realloc( floats, UInt( qty_of_bytes ) )

     )

     return realloced_floats

}

如果我在这里将KLUDGE设置为0,那么当我尝试为三个成员阵列中的一个新成员腾出空间时会发生这种情况:

在: [0.9,0.9,0.9]

出: [0.0,0.0,0.9,0.0]

我期望的是:

出: [0.9,0.9,0.9,0.0]

我发送的数组是在Swift中使用

创建的
var foo_floats = Floats.alloc(QTY_OF_FLOATS)

我对realloc的调用有什么问题?

1 个答案:

答案 0 :(得分:2)

我在Apple的开发者论坛上讨论了这个问题。事实证明,使用Swift的alloc为Swift数组分配空间,而不是C数组。因此,如果你想将MutableUnsafePointer用于C数组并使用“realloc”(从C桥接),你需要坚持使用C函数,比如“malloc”(从C桥接)。

通过添加以下函数,并在我最初设置Floats数组时使用它,“realloc”错误就消失了:

func floats_alloc( qty_of_floats:Int ) -> Floats  {

      // return Floats.alloc( qty_of_floats )

      let qty_of_bytes = ( qty_of_floats * FLOAT_SIZE )

      let alloced_floats = Floats(

           malloc( UInt( qty_of_bytes ) )

      )

      return alloced_floats

 }

我已经测试了几个星期了,一切都很顺利。