Julia get wrong value when I try to unsafe_load a pointer from C -
the c code:
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 kstr: %p\n", p); return p; }; the julia code
type kstr l::csize_t m::csize_t s::ptr{cchar} end problem
when use ccall call get_ptr_of_kstr , pointer of kstring_t in julia, use unsafe_load value, value seems wrong. messages below:
in c, kstr.l: 0 in c, kstr.m: 100000 in c, kstr.s: 0x37b59b0 in c, pointer kstr: 0x7fffe7d80b90 kstr = ptr{ht.kstr} @0x00007fffe7d80b90 unsafe_load(kstr).s = ptr{int8} @0x00007fffe7d80b90 the value of unsafe_load(kstr).s same kstr. why? how fix it?
regarding c part (i don't know bindings between julia , c):
kstring_t kstr = {0, num, ch}; that allocate kstr on stack in get_ptr_of_kstr() context. , pointer return invalid right after function exits. can't use anymore after that, not in c or other program might pass to.
as @lutfullahtomak hinted, should either:
- allocate heap
malloc()/calloc(), - pass pre-allocated pointer function , fill members,
- declare
staticin body of function, makes global variable scope reduced function only. note not practice though.
also, note c compiler align each struct member address, depending on options , #pragma pack (if used), offset of each field might not or julia expects.
Comments
Post a Comment