有人能告诉我这个C代码在做什么吗?

时间:2011-04-29 21:30:25

标签: c cython

Cansome告诉我这个cython代码的内容。完整代码见:

https://github.com/scipy/scipy/blob/master/scipy/spatial/ckdtree.pyx

# this is the standard trick for variable-size arrays:
# malloc sizeof(nodeinfo)+self.m*sizeof(double) bytes.
cdef struct nodeinfo:
    innernode* node
    double side_distances[0]

2 个答案:

答案 0 :(得分:3)

这是一个古老的C技巧。如果您不知道需要多少side_distances,通常因为它从nodeinfo的一个实例到另一个实例不同,那么您声明数组大小为零。然后,当您为节点分配内存时,您将分配struct 的大小sizeof(nodeinfo)),以及额外的内存,以获取您在该特定实例中所需的值的数量(+something * sizeof(double))。结果是这个实例,我们有足够的内存用于我们指定的大小的数组。

在某种意义上说,这是一个“技巧”,对于大多数用途,您可以分配一个单独的数组并在此数组中存储指向它的指针。将所有内容保存在一个分配中是(尝试)优化。

但是,IIRC,零大小的数组只允许使用C ++标准,而不是C标准。在C中,您应该将其定义为灵活大小的数组side_distances[],但毫无疑问,许多编译器允许C语言中的C ++版本作为扩展。但是,无论哪种方式,结构本身都不包含任何元素的空间,尽管它将与double正确对齐。

答案 1 :(得分:2)

这是C中的struct hack。我不知道它在Python(或cython)中的行为,但我认为你最好还是使用其他一些数据结构。< / p>

在C中,它用来假装有一个“可变大小的数组” 它需要动态分配内存。