UnsafePointer <int8>无效

时间:2017-11-14 20:55:58

标签: swift unsafe-pointers

以下单元测试总是失败,因为某些UnsafePointer等于其他一些。我观察到这种行为至少有3个字符串。 我在High Sierra版本10.13.1(17B48)上使用Xcode版本9.1(9B55)。

func testUnsafePointer() {
    let a = "aaa"
    let b = "bbb"
    let c = "ccc"

    let ua = UnsafePointer<Int8>(a)
    let ub = UnsafePointer<Int8>(b)
    let uc = UnsafePointer<Int8>(c)

    print("a: '\(a)', ua: '\(ua)'")
    print("b: '\(b)', ub: '\(ub)'")
    print("c: '\(c)', uc: '\(uc)'")

    XCTAssertTrue(ua != ub)
    XCTAssertTrue(ub != uc)
    XCTAssertTrue(uc != ua)
}

打印输出看起来与此类似

a: 'aaa', ua: '0x000060c000056a30'
b: 'bbb', ub: '0x00006080000530d0'
c: 'ccc', uc: '0x00006080000530d0'

NB。在快速的操场上,一切看起来都不错。

1 个答案:

答案 0 :(得分:2)

let ua = UnsafePointer<Int8>(a)

init(_ other: UnsafePointer<Pointee>)

UnsafePointer的初始化程序被调用。即你过世了 一个Swift String到一个函数UnsafePointer<Int8> 论点。在这种情况下,会创建一个临时 C字符串表示并传递给该函数, 比较String value to UnsafePointer<UInt8> function parameter behavior

该临时C字符串仅在函数持续时间内有效 调用,并在返回时,不保证内存指向 to ua仍包含该C字符串(或任何有效数据)。另外,

let ua = UnsafePointer<Int8>(a)
let ub = UnsafePointer<Int8>(b)
let uc = UnsafePointer<Int8>(c)
在这种情况下,

可以为临时C字符串使用相同的存储空间 正如你所观察到的那样,指针是相等的。

如果您打算使用const char *参数调用C函数,那么您可以简单地传递Swift字符串。编译器 将插入必要的代码以创建C字符串表示 (它们在函数调用期间再次有效), 正如String value to UnsafePointer<UInt8> function parameter behavior中所述:

let a = "aaa"
let b = "bbb"
let c = "ccc"

cfunc(a, b, c)