在swift中,调用c函数时,swift字符串在作为参数传递时自动强制为cstring。但是,在填写c结构或全局变量时,我并没有得到相同的行为。

strlen(swiftString)                     //Works!
CGlobalStruct.stringPtr = swiftString   //Doesn't work!

首先,当它们都是“const*char”时,为什么它们的行为会有所不同。其次,什么是填充c结构的最干净的方法?

最佳答案

swiftString可以作为参数传递给函数taking
aUnsafePointer<Int8>参数。编译器生成swift字符串的临时表示
作为以nul结尾的char序列,并将指针传递给
函数的C字符串。表示和指针仅在函数调用期间有效。那就是发生在

strlen(swiftString)

当分配全局C字符串指针时,必须采用
考虑此指针的生存期。一种可能性是
let swiftString = "Hello world"

swiftString.withCString {
    CGlobalStruct.stringPtr = $0

    // Pointer valid inside this closure ...
}
// Pointer not valid anymore ...

其中指向C字符串表示的指针被传递到闭包。
此指针(仅)在闭包执行期间有效。
为了延长使用寿命,您可以在内存中分配一个C字符串,
但你最终还是要释放记忆:
guard let cStringPtr = strdup(swiftString) else {
    fatalError("strdup failed")
}
CGlobalStruct.stringPtr = UnsafePointer(cStringPtr)

// ...

free(cStringPtr)

10-08 07:26