Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构到Swift_C_Swift_Struct - Fatal编程技术网

C结构到Swift

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

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