Python 3.x 无效指针崩溃

Python 3.x 无效指针崩溃,python-3.x,memory-management,cython,Python 3.x,Memory Management,Cython,我试图使用Cython包装一个C库,但尝试将bytes对象传递给函数时失败 我的Python如下所示: def tou8(s): return s.encode('utf-8') cdef char **alloc_strarr(in_arr, blen=0): size = len(in_arr) cdef char **out_arr = <char **>calloc(size, sizeof(char *)) cdef char *tempb

我试图使用Cython包装一个C库,但尝试将bytes对象传递给函数时失败

我的Python如下所示:

def tou8(s):
    return s.encode('utf-8')

cdef char **alloc_strarr(in_arr, blen=0):
    size = len(in_arr)
    cdef char **out_arr = <char **>calloc(size, sizeof(char *))
    cdef char *tempb
    if out_arr is NULL:
        raise MemoryError()
    fail = 0
    for i in range(0, size):
        b = tou8(in_arr[i])
        if blen:
            out_arr[i] = <char *>calloc(blen, sizeof(char))
            if out_arr[i] is NULL:
                fail = i
                break
            tempb = b
            rc = snprintf(out_arr[i], blen, b'%s', tempb)
            if rc >= blen:
                fail = i
                break
        else:
            out_arr[i] = b
    if fail:
        for i in range(0, fail):
            free(out_arr[i])
        free(out_arr)
        raise MemoryError()
    return out_arr

# this function inside a larger cdef class
def __cinit__(self, fieldc, fieldnames, primkey=''):
    cdef char **cfields = alloc_strarr(fieldnames, blen=FMAXLEN)
    cprimkey = tou8(primkey)
    self._list = so.cq_new_dlist(fieldc, cfields, cprimkey)
    free_all(cfields, len(fieldnames))
    if self._list is NULL:
        raise Exception('Memory or value error creating DataList')

我的初始化过程出了什么问题?

当您写入
out\u arr[i]=b
时,存储在
out\u arr[i]
中的指针指向
b
合并的内存,并且只有
b
指向的对象未被垃圾收集(例如在下一次迭代中)时才有效

一个完整的、可重复的答案会很有帮助。您还可以考虑添加一些打印语句来查看其确切位置。
$ python3
Python 3.4.2 (default, Dec 27 2014, 13:16:08) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymodule
>>> dl = mymodule.MyClass(1, ['test'])
*** Error in `python3': munmap_chunk(): invalid pointer: 0x00007fa4b6a17320 ***
Aborted