How can I get the memory address of a value type or a custom struct in Swift? How can I get the memory address of a value type or a custom struct in Swift? ios ios

How can I get the memory address of a value type or a custom struct in Swift?


According to Martin R' s answer

addressOf() cannot be used with struct variables. String is a struct, however, it is automatically bridged to NSString when passed to a function expecting an object.

According to nschum's answer, you can get the (stack) address of a struct, build-in type or object reference like this:

import UIKitfunc address(o: UnsafePointer<Void>) -> Int {    return unsafeBitCast(o, Int.self)}func addressHeap<T: AnyObject>(o: T) -> Int {    return unsafeBitCast(o, Int.self)}struct myStruct {    var a: Int}class myClas {}//structvar struct1 = myStruct(a: 5)var struct2 = struct1print(NSString(format: "%p", address(&struct1))) // -> "0x10f1fd430\n"print(NSString(format: "%p", address(&struct2))) // -> "0x10f1fd438\n"//Stringvar s = "A String"var aa = sprint(NSString(format: "%p", address(&s))) // -> "0x10f43a430\n"print(NSString(format: "%p", address(&aa))) // -> "0x10f43a448\n"//Classvar class1 = myClas()var class2 = class1print(NSString(format: "%p", addressHeap(class1))) // -> 0x7fd5c8700970print(NSString(format: "%p", addressHeap(class2))) // -> 0x7fd5c8700970unsafeAddressOf(class1) //"UnsafePointer(0x7FD95AE272E0)"unsafeAddressOf(class2) //"UnsafePointer(0x7FD95AE272E0)"//Intvar num1 = 55var num2 = num1print(NSString(format: "%p", address(&num1))) // -> "0x10f1fd480\n"print(NSString(format: "%p", address(&num2))) // -> "0x10f1fd488\n"

One thing I found is, if myStruct has no value, the address will be retain same:

struct myStruct {}var struct1 = myStruct()var struct2 = struct1print(NSString(format: "%p", address(&struct1))) // -> ""0xa000000000070252\n""print(NSString(format: "%p", address(&struct2))) // -> ""0xa000000000070252\n""


I'm not sure if there's a "recommended" way to do that, but one method is to use withUnsafePointer(_:_:), like this:

var s: String = "foo"withUnsafePointer(&s) { NSLog("\($0)") }

This printed 0x00007ffff52a011c8 on my machine.


Swift 2.0 :

You can use this unsafeAddressOf(someObject)

or in Swift 3.0:

use withUnsafePointer(to: someObejct) { print("\($0)") }