2017-06-05 64 views
1

在C文件:在迅速的文件结构C结构斯威夫特

struct CPerson { 
    const char* name; 
    int age; 
}; 

extension UnsafePointer where Pointee == Int8 { 
    var string : String? { 
    return String.init(cString: self) 
    } 
} 

我尝试使用C结构:

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 == “安吉拉”

感谢。

+0

您是否需要使用C结构(s)?为什么不使用Swift实现它? –

回答

1

这是一个内存管理问题。在

let p = CPerson(name: "angela", age: 1) 

你传递一个斯威夫特String采取的UnsafePointer<Int8> 参数(的const char *雨燕相当值)的功能。编译器插入 代码以创建一个临时 C字符串表示形式,并且 将其传递给CPerson初始化程序。 name字段然后将 指向该临时C字符串。

问题是当 初始值设定项返回时,此指针不再有效。它可能指向其他的东西,或者可能是一个无效指针 。

A const char *在C中只是一个指针,它并不意味着任何 所有权或内存管理。如果分配

person.name = someString; 

,离开这里someString定义范围你可能有完全用C一样 问题。

所以你必须决定谁负责 分配(和免费)的C字符串存储。

一种办法是复制串在斯威夫特和释放 当不再需要它的内存:

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()其分配和释放存储。

+0

谢谢!完美! – Xiuye