直接分配UnsafePointer

时间:2018-09-19 22:20:35

标签: swift unsafe-pointers

有人可以向我解释一下我在这里想念的东西吗?

给予

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。我不介意对此提出建议,但超出了原始问题的范围。

1 个答案:

答案 0 :(得分:4)

我不知道确切的理由,但是大概let ptr = &index是不允许的,因为不能保证您可以在不调用 undefined behaviour 的情况下取消引用ptr(假设{ {1}}不是全局变量或index存储变量,这是Swift保证稳定且唯一的指针值的唯一情况。

与其他语言不同,Swift不能保证局部变量将一直保持初始化状态,直到在其声明的作用域末尾为止-优化器可以自由地对其进行初始化。因此,允许static将使编写不正确的代码变得非常容易。

值得注意的是您的示例:

let ptr = &index

也是不完美的。尝试从func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> { return num } let ptr = point(num: &index) 解除对ptr的引用是未定义的行为,因为inout-to-pointer参数转换会生成一个仅在函数调用期间有效的临时指针。

如果要使用作用域的临时指针指向某个值,则可以使用withUnsafePointer(to:) –例如:

let ptr = point(num: &index)

请注意,该指针仅在关闭期间有效-尝试对其进行转义将导致不确定的行为。