代码之家  ›  专栏  ›  技术社区  ›  Brandon M

直接分配未安全指针

  •  2
  • Brandon M  · 技术社区  · 6 年前

    鉴于

    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 回复  |  直到 6 年前
        1
  •  5
  •   Hamish    6 年前

    let ptr = &index 是不允许的,因为不能保证你可以取消引用 ptr 不调用 index 不是全球性的 static 存储变量(只有在Swift保证稳定且唯一的指针值的情况下)。

    设ptr=&指数 因此,编写不可靠的代码太容易了。

    值得注意的是,您的示例:

    func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> {
        return num
    }
    let ptr = point(num: &index)
    

    ptr公司 let ptr = point(num: &index) 是未定义的行为,因为inout-to-pointer参数转换生成的临时指针仅在函数调用期间有效。

    如果你想要一个 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!
      }
    }
    

    请注意,指针仅在闭包期间有效,尝试转义它将导致未定义的行为。