【问题标题】:Pointer dereferencing in Julia (unsafe_load(ptr) works but unsafe_wrap(Array, ptr, 1) segfaults)Julia 中的指针取消引用(unsafe_load(ptr) 有效,但 unsafe_wrap(Array, ptr, 1) 段错误)
【发布时间】:2022-01-13 19:39:57
【问题描述】:

我正在尝试使用 unsafe_loadunsafe_wrap 取消引用指针。我发现unsafe_load 工作得很好,但是unsafe_wrap 在取消引用指向可变结构的指针的情况下崩溃。玩具示例:

[mutable] struct Wrapper
    data::Int
end

some = Wrapper(1)
ptr = convert(Ptr{Wrapper}, Base.Libc.malloc(sizeof(Wrapper)))
unsafe_store!(ptr, some)

unsafe_load(ptr) # returns Wrapper(1)
unsafe_wrap(Array, ptr, 1) # segfaults if Wrapper is mutable, works fine if not

而且我完全需要unsafe_wrap,因为它不会复制(我需要在malloc 分配的内存中就地执行一些操作)。为什么会出现段错误?

【问题讨论】:

    标签: pointers julia dereference


    【解决方案1】:

    找到答案here

    可变结构的向量是指针的向量,即

    mutable struct Wrapper
        data::Int
    end
    
    a = Wrapper(1)
    b = [a, a]
    a.data = 2
    b # is now Wrapper[Wrapper(2), Wrapper(2)]
    

    所以IntWrapper的内存布局不一样。

    【讨论】:

    • 我正要评论说我怀疑这个问题是sizeof 计算字段的大小而不管结构是否可变,因此它不能用于查找结构占用的内存向上作为 Vector 元素或另一个结构的字段,例如 Ptr 的字段。但是,后来我有一个想法:指针是Int 大小的,所以sizeof 似乎意外地是正确的,因为你的结构的字段也是Int 大小的。如果malloc 意外正确,您能解释一下段错误是如何发生的吗?
    猜你喜欢
    • 2020-04-28
    • 2021-04-06
    • 2017-09-21
    • 2013-07-19
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多