[英]C Struct to Swift
在c文件中:有一个结构
struct CPerson {
const char* name;
int age;
};
在快速文件中:
extension UnsafePointer where Pointee == Int8 {
var string : String? {
return String.init(cString: self)
}
}
我尝试使用c struct:
print(CPerson(name: "baby", age: 1).name.string)
//Optional("baby")
但是:
let p = CPerson(name: "angela", age: 1)
print(p.name.string , p.age)
//Optional("") 1
为什么p.name.string ==“”?
我希望p.name.string ==“ angela”
谢谢。
这是一个内存管理问题。 在
let p = CPerson(name: "angela", age: 1)
您将Swift String
传递给带有UnsafePointer<Int8>
参数的函数(与const char *
的Swift等效)。 编译器插入代码以创建一个临时 C字符串表示形式,并将其传递给CPerson
初始化程序。 然后, name
字段指向该临时C字符串。
问题是初始化初始化器返回时,该指针不再有效。 它可能指向其他内容,或者可能是无效的指针。
C语言中的const char *
只是一个指针,并不意味着任何所有权或内存管理。 如果分配,您在C中会遇到完全相同的问题
person.name = someString;
并保留定义了someString
的范围。
因此,您必须确定谁负责分配(和释放)C字符串存储。
一种选择是在Swift中复制字符串并在不再需要时释放内存:
let name = strdup("angela")
let p = CPerson.init(name: name, age: 1)
print(p.name.string , p.age) // Optional("angela") 1
free(name)
另一个选择可能是创建分配和释放存储的C函数CreatePerson()
和ReleasePerson()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.