我想按照下面的方法将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的答案中的代码存在严重的问题,这些问题可能会导致程序在长期内崩溃。在
(一)
^{pr2}$cpt1
是指向(一组)字符指针的指针。因此,应将其指定为(更好的是,如果长度总是
2
,那么在结构定义中分配char *cpt1[2]
,而不需要malloc
它。)这不太可能引起真正的问题,因为所有指针的大小都相同,但仍然是错误的。在
2) (真正的问题a部分)
在这里,您分配了一些内存,如果您愿意让指针指向Python字符串所拥有的不同内存区域,则会立即忘记已分配的内存。您不需要做的是将Python字符串中的数据复制到分配的内存中。在
3) (真正的问题b部分)
cpt1[0]
指向的内存归str1
所有。{6}如果你的cd6结构已经被释放了,那么稍后你的程序就会释放一些无效的数据。在如果您可以保证
str1
将比您的结构寿命长(例如,您的结构被用作一个C函数调用的参数),那么这是可以的,但在一般情况下,它可能不是解决方案是将内容或
str1
复制到新分配的内存中:(另外,你还记得要
free
你所有的记忆,对吗?)在解决方案是在赋值之前对python字符串进行编码,如下所示
相关问题 更多 >
编程相关推荐