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

时间:2017-08-04 09:16:01

标签: 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])

这是结果

  

(&#39;得分:&#39;,1.0)

     

2

     

3

     

4

2 个答案:

答案 0 :(得分:1)

解决方案是在分配之前对python字符串进行编码,如下所示

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

答案 1 :(得分:1)

问题和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函数调用的参数)那么这是可以的,但在一般情况下它可能不是&#39;吨。

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

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

(另外,您还记得free malloc所有的记忆,对吗?)