ios - 线程1 : Fatal error: UnsafeMutablePointer. 初始化重叠范围

标签 ios iphone swift xcode

我正在尝试使用

UnsafeMutablePointer<UnsafeMutablePointer<Float>?>!

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

我通过这样做创造了这个值(value):

 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

我做错了什么?

最佳答案

你正在制造不良行为..

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<Float>?.init(uint8Pointer2)

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

所以当你这样做的时候:

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

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


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

现在你决定做:

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

在这里你创建了一个指向uint8Pointer1的指针(uint8Pointer)你说 uint8Pointer1uint8Pointer 初始化.. 但您正在初始化一个指针,该指针带有指向自身的指针,计数为 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.

关于ios - 线程1 : Fatal error: UnsafeMutablePointer. 初始化重叠范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52175226/

相关文章:

iOS推送通知自定义声音无法弄清楚

ios - 西类牙语支持重拍和使用 UIImagePickerController 的照片按钮

ios - GradientLayer 不水平填充 UIButton 边界

iphone - iPhone OpenGL ES 工具中的 Tiler Utilization 统计数据意味着什么?

iphone - 在最新的 Facebook API 中使用 @"message"状态更新字段为空

swift - 添加 Float 值时,表达式类型在没有更多上下文的情况下不明确

ios - Firebase Crashlytics 迁移和查看仪表板

ios - iPhone 6s - iOS 9.1 在 [UICollectionViewController previewingContext :viewControllerForLocation:] 上崩溃

iphone - 获取当前时间并从中减去 3 小时

ios - 使用数组中的字符串淡入/淡出标签