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

I’m trying to gain a deeper understanding of how Swift copies value types:

The behavior you see in your code will always be as if a copy took
place. However, Swift only performs an actual copy behind the scenes
when it is absolutely necessary to do so.

  • How to get Core Data object from specific Object ID?
  • IOS AutoLayout Change possition on Rotation
  • No Push Notification Capability in Xcode
  • How to add HeaderView in UICollectionView like UITableView's tableHeaderView
  • How do I add a still image to an AVComposition?
  • How to check if a character is supported by a font
  • To advance my understanding, I’d like to get the memory address of a value type. I tried unsafeAddressOf(), but this doesn’t work with structs and it seems to cast Swift’s standard library types to reference types (e.g. String is cast to NSString).

    How can I get the memory address of a value type, like an instance of Int, or a custom struct in Swift?

    3 Solutions Collect From Internet About “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 UIKit
    
    
    func 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 {
    
    }
    //struct
    var struct1 = myStruct(a: 5)
    var struct2 = struct1
    print(NSString(format: "%p", address(&struct1))) // -> "0x10f1fd430\n"
    print(NSString(format: "%p", address(&struct2))) // -> "0x10f1fd438\n"
    
    //String
    var s = "A String"
    var aa = s
    print(NSString(format: "%p", address(&s))) // -> "0x10f43a430\n"
    print(NSString(format: "%p", address(&aa))) // -> "0x10f43a448\n"
    
    //Class
    var class1 = myClas()
    var class2 = class1
    print(NSString(format: "%p", addressHeap(class1))) // -> 0x7fd5c8700970
    print(NSString(format: "%p", addressHeap(class2))) // -> 0x7fd5c8700970
    
    unsafeAddressOf(class1) //"UnsafePointer(0x7FD95AE272E0)"
    unsafeAddressOf(class2) //"UnsafePointer(0x7FD95AE272E0)"
    
    //Int
    var num1 = 55
    var num2 = num1
    print(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 = struct1
    print(NSString(format: "%p", address(&struct1))) // -> ""0xa000000000070252\n""
    print(NSString(format: "%p", address(&struct2))) // -> ""0xa000000000070252\n""
    

    Swift 2.0 :

    You can use this unsafeAddressOf(someObject)

    or in Swift 3.0:

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

    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.