1

我正在尝试构建一个 python C 扩展,以便将一个 numpy 矩阵传递给一个 C 数组。我正在遵循此处报告的建议:

http://wiki.scipy.org/Cookbook/C_Extensions/NumPy_arrays

但是当 Python 尝试运行 C 行时:

v=(float **)malloc((size_t) (n*sizeof(float)));

以下部分代码:

float **_ptrvector(long n) { 
    float **v;
    v=(float **)malloc((size_t) (n*sizeof(float)));
    if (!v)   {
        printf("In **ptrvector. Allocation of memory for array failed.");
        exit(0); }
    return v;
}

float **pymatrix_to_carray(PyArrayObject *arrayin)  {
    float **c, *a;
    int i,n,m;

    n = PyArray_DIM(arrayin, 0);
    m = PyArray_DIM(arrayin, 1);
    c=_ptrvector(n);
    a = (float*) PyArray_DATA(arrayin);
    for ( i=0; i<n; i++)  {
        c[i]=a+i*m;  }  
    return c;
}

我的 Linux 64 位机器出现分段错误。问题是这段代码在 32 位机器(Windows 和 Linux)上完美运行。此外 sizeof(size_t) 在 32 位机器上正确返回 4,在 64 位机器上正确返回 8。我在内核版本为 2.6.18 的 Red Hat Linux 4.2.1-44 上使用 Python 2.7.1 [EPD 7.0-2(64 位)] 和 GCC 4.1.2。

我也尝试使用 npy_intp 和 Py_ssize_t 而不是 size_t 但没有积极效果。

4

1 回答 1

2

在这里,您要为指向的指针分配内存float

float **v;
v=(float **)malloc((size_t) (n*sizeof(float)));

但是您确实为自己分配了内存float。在 32 位系统上,指针需要 4 个字节,所以这是可行的。

在 64 位系统上,指针需要 8 个字节,因此您可能希望将上面的行更改为:

float ** v = malloc(n * sizeof(float*));

甚至更安全

float ** v = malloc(n * sizeof(*v));

顺便说一句:在 C 中,不需要对结果进行强制转换,malloc/calloc/realloc也不建议这样做。这样做更危险,因为它可能隐藏可怕的错误。

于 2013-08-07T13:34:12.007 回答