python - cython结构,从python到cython的字符串

标签 python c cython

我想像下面那样将 python 对象转换为 cython 结构,但它不会将 simres[1] 的值分配给 resulta[x].cpt1

cdef struct resultaStructure:
    double score
    char **cpt1

simRes = [1.0,
['http://bioontology.org/projects/ontologies/fma/fmaOwlDlComponent_2_0#Abdomen', 
'Abdomen']]
cdef x = 0 
cdef resultaStructure *resulta = <resultaStructure *> malloc(sizeof(resultaStructure)*labelsSourceTaille)

resulta[x].score = simRes[0]
print("score : ",resulta[0].score)

resulta[x].cpt1 = <char**> malloc (sizeof (char**)*2)
print('2')
resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*simRes[1][0].__len__()+1)
print('3')
resulta[x].cpt1[1] = <char*> malloc (sizeof (char)*simRes[1][1].__len__()+1)
print('4')
resulta[x].cpt1[0] = <char*> simRes[1][0]
print('5')
resulta[x].cpt1[1] = <char*>  simRes[1][1]
print('6')

print("cpt1 0 : ",resulta[0].cpt1[0])
print("cpt1 1 : ",resulta[0].cpt1[1])

这是结果

('score :', 1.0)

2

3

4

最佳答案

问题中的代码和 OP 的答案中的代码存在严重问题,从长远来看可能会导致程序崩溃。

1)

resulta[x].cpt1 = <char**> malloc (sizeof (char**)*2)

cpt1 是指向(数组)char 指针的指针。因此它应该被分配为

resulta[x].cpt1 = <char*> malloc (sizeof (char*)*2)

(更好的是,如果长度始终为 2,则在结构定义中分配 char *cpt1[2] 并且您不需要 malloc 它。)

这不太可能导致真正的问题,因为所有指针的大小都相同,但它仍然是错误的。

2)(真正的问题a部分)

resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*simRes[1][0].__len__()+1)
# ...
resulta[x].cpt1[0] = <char*>some_python_string

此处分配了一些内存,如果希望将指针指向 Python 字符串拥有的不同内存区域,则立即忘记分配的内存。您做的是将数据从 Python 字符串复制到分配的内存中。

3)(真正的问题b部分)

str1 = simRes[1][0].encode('UTF-8')
resulta[x].cpt1[0] = <char*> str1

cpt1[0] 指向的内存属于str1。如果 str1 在您使用完您的结构之前被释放,那么该结构将指向无效内存并且您的程序将崩溃,或者读取一些稍后分配的随机数据,或者其他一些不好的事情。

如果你能保证 str1 会比你的结构更长久(例如,你的结构被用作一个 C 函数调用的参数)那么这没问题,但在一般情况下它可能是't.

解决方案是将内容或 str1 复制到您新分配的内存中:

resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*len(simRes[1][0])+1)
strcpy(resulta[x].cpt1[0],str1)

(此外,您还记得释放malloced的所有内存,对吧?)

关于python - cython结构,从python到cython的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45502850/

相关文章:

c++ - 使用 CMake 在 C++ 中未定义的 Python 引用

c - C中堆栈上的跟踪函数

c++ - 为什么声明为指向字符的指针并分配了 2 个字节大小的 String 的大小会被更改?

python - 我可以 pip 安装 cython 模块并使其 pxds 可用于 cimport 吗?

python-3.x - 为什么 Cython 中的这个循环和它的 Python 等效循环一样慢?

c - 为什么我们需要在 C 函数的末尾使用 'return 0' ?

python - Gimp python-fu : How to create and save multilayer xcf from 1 jpg and 1 png?

python - 如何解析包含多个对象的单行json文件

python - 用于绘图软件的 PIL 和 Tkinter

python - "is"运算符对整数的行为异常