直接赋值UnsafePointer
Directly assign UnsafePointer
有人可以向我解释一下我在这里缺少什么吗?
给出
let index: Int32 = 100
为什么这样不行:
// Use of extraneous '&'
let ptr = &index // Type inference?
甚至:
// Use of extraneous '&'
let ptr: UnsafePointer<Int32> = &index
但这是:
{
func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> {
return num
}
let ptr = point(num: &index)
}
这将是 C:
中的简单等价物
int index = 100;
int *ptr = &index;
我真的必须定义一个函数,从字面上获取引用值并传回完全相同的引用吗?感觉有些不对劲。看来我在这里遗漏了一些东西,甚至可能是最基本的东西。
如何将 UnsafePointer 分配给其类型(在本例中为 Int32)的内存地址???
谢谢!
编辑:
最终我想要完成的是,我需要将几种不同的结构写入一个二进制文件。变量 index
将是结构的 属性。我现在要走的路涉及一个文件OutputStream
。我不介意收到有关此的建议,但超出了原始问题的范围。
我不知道确切的理由,但大概 let ptr = &index
是不允许的,因为不能保证您可以取消引用 ptr
而不调用 未定义的行为(假设 index
不是全局变量或 static
存储变量——只有 Swift 保证稳定且唯一的指针值的情况)。
与其他语言不同,Swift 不保证局部变量在其声明的范围结束之前将保持初始化状态——优化器可以自由地提前取消初始化它。因此,允许 let ptr = &index
会使编写不合理的代码变得太容易了。
值得注意的是您的示例:
func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> {
return num
}
let ptr = point(num: &index)
也是不健全的。尝试从 let ptr = point(num: &index)
中取消引用 ptr
是未定义的行为,因为 inout 到指针参数转换会产生一个临时指针,仅在函数调用期间有效。
如果你想要一个 scoped 临时指针指向一个值,你可以使用 withUnsafePointer(to:)
– 例如:
func baz() {
var foo = 5
withUnsafePointer(to: &foo) { ptr in
// use `ptr` here – do not escape it!
}
// In Swift 4.2 you can also use `withUnsafePointer(to:)` on let constants.
let bar = 5
withUnsafePointer(to: bar) { ptr in
// use `ptr` here – do not escape it!
}
}
请注意,指针仅在闭包期间有效——试图将其转义将导致未定义的行为。
有人可以向我解释一下我在这里缺少什么吗?
给出
let index: Int32 = 100
为什么这样不行:
// Use of extraneous '&'
let ptr = &index // Type inference?
甚至:
// Use of extraneous '&'
let ptr: UnsafePointer<Int32> = &index
但这是:
{
func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> {
return num
}
let ptr = point(num: &index)
}
这将是 C:
中的简单等价物int index = 100;
int *ptr = &index;
我真的必须定义一个函数,从字面上获取引用值并传回完全相同的引用吗?感觉有些不对劲。看来我在这里遗漏了一些东西,甚至可能是最基本的东西。
如何将 UnsafePointer 分配给其类型(在本例中为 Int32)的内存地址???
谢谢!
编辑:
最终我想要完成的是,我需要将几种不同的结构写入一个二进制文件。变量 index
将是结构的 属性。我现在要走的路涉及一个文件OutputStream
。我不介意收到有关此的建议,但超出了原始问题的范围。
我不知道确切的理由,但大概 let ptr = &index
是不允许的,因为不能保证您可以取消引用 ptr
而不调用 未定义的行为(假设 index
不是全局变量或 static
存储变量——只有 Swift 保证稳定且唯一的指针值的情况)。
与其他语言不同,Swift 不保证局部变量在其声明的范围结束之前将保持初始化状态——优化器可以自由地提前取消初始化它。因此,允许 let ptr = &index
会使编写不合理的代码变得太容易了。
值得注意的是您的示例:
func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> {
return num
}
let ptr = point(num: &index)
也是不健全的。尝试从 let ptr = point(num: &index)
中取消引用 ptr
是未定义的行为,因为 inout 到指针参数转换会产生一个临时指针,仅在函数调用期间有效。
如果你想要一个 scoped 临时指针指向一个值,你可以使用 withUnsafePointer(to:)
– 例如:
func baz() {
var foo = 5
withUnsafePointer(to: &foo) { ptr in
// use `ptr` here – do not escape it!
}
// In Swift 4.2 you can also use `withUnsafePointer(to:)` on let constants.
let bar = 5
withUnsafePointer(to: bar) { ptr in
// use `ptr` here – do not escape it!
}
}
请注意,指针仅在闭包期间有效——试图将其转义将导致未定义的行为。