不安全指针<Int8>不起作用



下面的单元测试总是失败,因为一些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'

注:。在swift操场上一切看起来都很好。

在中

let ua = UnsafePointer<Int8>(a)

init(_ other: UnsafePointer<Pointee>)

调用CCD_ 1的初始化器。也就是说,你正在通过SwiftString到取CCD_论点在这种情况下,创建临时C字符串表示并将其传递给函数,将字符串值与UnsafePointer<UInt8>函数参数行为。

该临时C字符串仅在函数的持续时间内有效调用,返回时,不能保证内存指向到的CCD_ 4仍然包含该C字符串(或任何有效数据)。此外,

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

在这种情况下,可以对临时C字符串使用相同的存储正如你所观察到的,指针是相等的。


如果您的意图是调用一个带有const char *参数的C函数,那么您可以简单地传递Swift字符串。编译器将插入创建C字符串表示所需的代码(在函数调用的持续时间内再次有效),如UnsafePointer<UInt8>函数参数行为:

let a = "aaa"
let b = "bbb"
let c = "ccc"
cfunc(a, b, c)

最新更新