【问题标题】:Thread 1: Fatal error: UnsafeMutablePointer.initialize overlapping range线程 1:致命错误:UnsafeMutablePointer.initialize 重叠范围
【发布时间】:2018-09-04 23:37:33
【问题描述】:

我正在尝试使用

UnsafeMutablePointer<UnsafeMutablePointer<Float>?>!

因为它是我需要使用的方法的参数所必需的。但是我不知道这是什么或如何使用它。

我通过这样做创造了这个价值:

 var bytes2: [Float] = [39, 77, 111, 111, 102, 33, 39, 0]
    let uint8Pointer2 = UnsafeMutablePointer<Float>.allocate(capacity: 8)
    uint8Pointer2.initialize(from: &bytes2, count: 8)

    var bytes: [Float] = [391, 771, 1111, 1111, 1012, 331, 319, 10]
    var uint8Pointer = UnsafeMutablePointer<Float>?.init(uint8Pointer2)
    uint8Pointer?.initialize(from: &bytes, count: 8)

    let uint8Pointer1 = UnsafeMutablePointer<UnsafeMutablePointer<Float>?>!.init(&uint8Pointer)
    uint8Pointer1?.initialize(from: &uint8Pointer, count: 8)

但我得到了错误:

Thread 1: Fatal error: UnsafeMutablePointer.initialize overlapping range

我做错了什么?

【问题讨论】:

    标签: ios iphone swift xcode


    【解决方案1】:

    您正在制造不良行为..

    var bytes2: [Float] = [39, 77, 111, 111, 102, 33, 39, 0]
    let uint8Pointer2 = UnsafeMutablePointer<Float>.allocate(capacity: 8)
    uint8Pointer2.initialize(from: &bytes2, count: 8)
    

    创建一个指向某个内存的指针并将该内存初始化为存储在bytes2..中的值。

    所以:uint8Pointer2 = [39, 77, 111, 111, 102, 33, 39, 0]


    然后你决定创建一个引用该指针内存的指针:

    var uint8Pointer = UnsafeMutablePointer&lt;Float&gt;?.init(uint8Pointer2)

    因此,如果您打印 uint8Pointer,它将具有与 uint8Pointer2.. 完全相同的值。如果您决定更改它的任何值,它也会更改 uint8Pointer2..

    所以当你这样做时:

    var bytes: [Float] = [391, 771, 1111, 1111, 1012, 331, 319, 10]
    uint8Pointer?.initialize(from: &bytes, count: 8)
    

    它用[391, 771, 1111, 1111, 1012, 331, 319, 10]覆盖了uint8Pointer2的值..


    到目前为止,uint8Pointer 只是uint8Pointer2 的一个浅拷贝。更改一个会影响另一个..

    现在你决定这样做:

    let uint8Pointer1 = UnsafeMutablePointer<UnsafeMutablePointer<Float>?>!.init(&uint8Pointer)
    uint8Pointer1?.initialize(from: &uint8Pointer, count: 8)
    

    在这里,您创建了一个指向 uint8Pointer 的指针 (uint8Pointer1),并且您说 uint8Pointer1 使用 uint8Pointer 进行初始化.. 但是您正在使用指向自身的指针和计数为 8 的指针初始化..

    首先,不要费心在一个指向自身值的指针上调用初始化。它已经指向正确的值了。

    很好的是:

    uint8Pointer1?.initialize(from: &uint8Pointer, count: 1)
    //Same as:  memcpy(uint8Pointer1, &uint8Pointer, sizeof(uint8Pointer)`
    //However, they both point to the same memory address..
    

    会崩溃,但是:

    uint8Pointer1?.initialize(from: &uint8Pointer)
    //Same as: `uint8Pointer1 = uint8Pointer`.. Note: Just a re-assignment.
    

    不会..因为它不会为后者执行memcpy .. 而前者会。

    希望我解释正确..

    附:正确命名变量!


    C++ 人的翻译:

    //Initial pointer to array..
    float bytes2[] = {39, 77, 111, 111, 102, 33, 39, 0};
    float* uint8Pointer2 = &bytes[2];
    memcpy(uint8Pointer2, &bytes2[0], bytes2.size() * sizeof(float));
    
    //Shallow/Shadowing Pointer...
    float* uint8Pointer = uint8Pointer2;
    float bytes[] = {391, 771, 1111, 1111, 1012, 331, 319, 10};
    memcpy(uint8Pointer, &bytes[0], bytes.size() * sizeof(float));
    
    //Pointer to pointer..
    float** uint8Pointer1 = &uint8Pointer;
    
    //Bad.. uint8Pointer1 and &uint8Pointer is the same damn thing (same memory address)..
    //See the line above (float** uint8Pointer1 = &uint8Pointer)..
    memcpy(uint8Pointer1, &uint8Pointer, 8 * sizeof(uint8Pointer));
    //The memcpy is unnecessary because it already pointers to the same location.. plus it's also wrong lol.
    

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多