次の単体テストは、一部のUnsafePointerが他と同じように常に失敗します。この動作は少なくとも3つの文字列で観察されます。 High Sierra Version 10.13.1(17B48)でXcodeバージョン9.1(9B55)を使用しています。UnsafePointer <Int8>が動作しない
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に似ています。迅速な遊び場では、すべてが大丈夫です。 UnsafePointer
の
init(_ other: UnsafePointer<Pointee>)
イニシャライザが呼び出され
let ua = UnsafePointer<Int8>(a)
で
を'あなたが思っていることをやってはいけません - Swiftは、指定された文字列のヌルで終了するUTF-8バイトで新しいバッファを作成し、そのバッファへのポインタを与えます。コールが終了した後にバッファが割り当て解除されるため、ぶら下がったポインタが残されます。したがって、同じ値を共有するポインタの問題ではありません。しかし、彼らはポインタをぶら下げているので、それらを逆参照しようとすることは*未定義の動作*です。あなたがここでやろうとしていることは、確かにそれについて行く正しい方法ではありません。 – Hamish
@Hamishこれは動作を説明しています。私が意図したのは、このシグネチャを持つC関数に素早い文字列を渡すことです:void cfunc(const char * a、const char * b、const char * c)。しかし、このcfuncでは、最初の文字列は問題なく、他の文字列はガベージです。私はUnsafePointer変換でこのc関数を呼び出します。 – swift616
@ swift616: 'cfunc(a、b、c)'を呼び出すだけで、コンパイラは自動的に変換に必要なコードを作成します。 –