如何在没有循环的情况下在 Cython 中创建空的 char 数组

How to create empty char arrays in Cython without loops

嗯,这看起来很简单,但我在网上找不到任何参考资料。在 C 中,我们可以创建一个 char 数组 n 空字符,如下所示:

char arr[n] = "";

但是当我尝试在 Cython 中使用

做同样的事情时
cdef char arr[n] = ""

我得到这个编译错误:

Error compiling Cython file:
------------------------------------------------------------
...
cdef char a[n] = ""
                   ^
------------------------------------------------------------

Syntax error in C variable declaration

显然 Cython 不允许以这种方式声明数组,但是有替代方法吗?我不想手动设置数组中的每个项目,也就是说我不是在寻找这样的东西

cdef char a[10]
for i in range(0, 10, 1):
    a[i] = b"[=13=]"

怎么样:

cdef char *arr = ['[=10=]']*n

在 C 中,'' 用于字符,"" 用于字符串。但是任何 'empty char' 并没有真正意义,可能你想要的是 '\0' 或者只是 0

也许:

import cython
from libc.stdlib cimport malloc, free

cdef char * test():
    n = 10
    cdef char *arr = <char *>malloc(n * sizeof(char))

    for n in range(n):
        arr[n] = '[=10=]'

    return arr

编辑

void *
 calloc(size_t count, size_t size);

为你做的,

您不必设置每个元素来生成长度为零的 C 字符串。只需将第一个元素置零就足够了:

cdef char arr[n]
arr[0] = 0

接下来,如果要将整个 char 数组归零,请使用 memset

from libc.string cimport memset
cdef char arr[n]
memset(arr, 0, n)

如果 C 纯粹主义者抱怨 0 而不是 '\0',请注意 '\0' 在 Cython 中是一个 Python 字符串(Python 3 中的 unicode)。 '\0' 不是 Cython 中的 C 字符! memset 的第二个参数需要一个整数值,而不是 Python 字符串。

如果你真的想知道 Cython 中 C '\0' 的 int 值,你必须在 C:

中编写一个辅助函数
/* zerochar.h */
static int zerochar() 
{
    return '[=12=]';
}

现在:

cdef extern from "zerochar.h":
    int zerochar()

cdef char arr[n]
arr[0] = zerochar()

cdef extern from "zerochar.h":
    int zerochar()

from libc.string cimport memset
cdef char arr[n]
memset(arr, zerochar(), n)