在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)