c - 当我尝试从 C 中 unsafe_load 一个指针时,Julia 得到了错误的值

标签 c julia

C代码:

typedef struct __kstring_t {
    size_t l, m;
    char *s;
} kstring_t;

kstring_t * get_ptr_of_kstr(int num){
    char * ch = (char *)malloc(num);
    kstring_t kstr = {0, num, ch};
    kstring_t *p = &kstr;
    printf("In C, kstr.l: %zu\n", p->l);
    printf("In C, kstr.m: %zu\n", p->m);
    printf("In C, kstr.s: %p\n", p->s);
    printf("In C, pointer to kstr: %p\n", p);
    return p;
};

Julia 代码

type KStr
l::Csize_t
m::Csize_t
s::Ptr{Cchar}
end

问题

当我使用ccall 调用get_ptr_of_kstr 并在Julia 中获取kstring_t 的指针时,使用unsafe_load 来得到它的值(value),但值(value)似乎是错误的。 消息如下:

In C, kstr.l: 0
In C, kstr.m: 100000
In C, kstr.s: 0x37b59b0
In C, pointer to kstr: 0x7fffe7d80b90
kstr = Ptr{HT.KStr} @0x00007fffe7d80b90
unsafe_load(kstr).s = Ptr{Int8} @0x00007fffe7d80b90

unsafe_load(kstr).s的值与kstr相同。为什么?如何解决?

最佳答案

关于C部分(我不知道Julia和C之间的绑定(bind)):

kstring_t kstr = {0, num, ch};

这将在get_ptr_of_kstr() 上下文中的堆栈 上分配kstr。函数退出后,您返回的指向它的指针立即无效。之后你不能再使用了,不能在 C 或你可能传递给它的任何其他程序中使用。

正如@LutfullahTomak 所暗示的,您应该:

  • 通过 malloc()/calloc()分配它,
  • 将预分配的指针传递给函数并填充其成员,
  • 在函数体中将它声明为static,这使它成为一个全局变量,作用域缩小到只限于函数。请注意,这不是好的做法。

另请注意,您的 C 编译器会将每个结构成员与地址对齐,具体取决于其选项和 #pragma pack (如果使用),因此每个字段的偏移量可能不是您或 Julia 所期望的。

关于c - 当我尝试从 C 中 unsafe_load 一个指针时,Julia 得到了错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831490/

相关文章:

julia - 是否有一个方便的函数来计算 GLM.jl 的 lm 的 R^2?

julia - 在 Julia 功能: passed by reference or value?

C - 直接从终端扫描值

c - 如何在 C 中使用 malloc() 分配结构数组?

objective-c - 从函数内的循环返回数字列表

julia - Julia 中的排序索引(相当于 numpy 的 argsort)

Julia 打印函数将 UInt32 数组打印为十六进制

c - 在运行时重定向一个 c 函数并调用原始函数

c++ - 如何构建项目 Visual Studio 可以跨平台运行

types - Julia 中需要多久进行一次类型声明才能获得最佳性能?