C结构到Swift
在c文件中:有一个结构C结构到Swift,c,swift,struct,C,Swift,Struct,在c文件中:有一个结构 struct CPerson { const char* name; int age; }; 在swift文件中: extension UnsafePointer where Pointee == Int8 { var string : String? { return String.init(cString: self) } } 我尝试使用c结构: print(CPerson(name: "baby", age: 1).name.strin
struct CPerson {
const char* name;
int age;
};
在swift文件中:
extension UnsafePointer where Pointee == Int8 {
var string : String? {
return String.init(cString: self)
}
}
我尝试使用c结构:
print(CPerson(name: "baby", age: 1).name.string)
//Optional("baby")
但是:
为什么p.name.string==“”
我希望p.name.string==“angela”
谢谢。这是内存管理问题。在
let p = CPerson(name: "angela", age: 1)
将Swift字符串
传递给使用非安全指针的函数
参数(Swift等价于常量字符*
)。编译器插入
用于创建临时C字符串表示形式和
将其传递给CPerson
初始值设定项。然后,name
字段指向
到该临时C字符串
问题是当
初始值设定项返回。它可能指向其他东西,也可能是一个
无效指针
C中的const char*
只是一个指针,并不意味着任何
所有权或内存管理。你会有完全一样的
如果您指定
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()
分配和释放存储。是否需要使用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)