0

我正在使用以下 C 函数来模拟 4D 数组。除了添加额外的循环之外,有没有一种好方法可以使这个函数足够通用以创建 n 维数组?

double ****alloc_4D_data(int wlen, int xlen, int ylen, int zlen)
{
    int i,j,k;

    double ****ary = (jdouble****)malloc(wlen*sizeof(jdouble***));

    for (i = 0; i < wlen; i++) 
    {
        ary[i] = (jdouble***)malloc(xlen*sizeof(jdouble**));

        for (j = 0; j < xlen; j++) 
        {
            ary[i][j] = (jdouble**)malloc(ylen*sizeof(jdouble*));

            for (k = 0; k < ylen; k++) 
            {
                ary[i][j][k] = (jdouble*)malloc(zlen*sizeof(jdouble));
            }
        }
    }

    return ary;
}
4

2 回答 2

2

在 C 语言中,多维数组的每个元素都存储在一个连续的内存区域中。所以你只需要计算所有 N 维的元素总数并 malloc 整个内存。如:

/* int *Nlen is a N length array to store every dimensional array length
 * int N is the Nlen array length indicates how many dimensions.
 */
double *alloc_ND_data(int wlen, int *Nlen, int N)
{
    int i;
    int total = 1;
    double *array;

    for(i = 0; i < N; i ++) {
    /* Every dimension should mul the next depth dimension size */ 
        total *= Nlen[i]; 
    }
    array = malloc(wlen*total*sizeof(jdouble));

    return array;
}
于 2013-09-15T17:11:58.540 回答
0

用这种方式构建的数组具有非常明显的递归结构。即第 i 级内存只是指向第 (i-1) 级内存的指针数组。只有第 0 级内存包含实际对象而不是指针。因此,您可以通过这种方式轻松实现它,将大小传入单独的整数数组中。

在这种情况下,递归将是尾递归,这意味着它可以很容易地被真正的循环实现替换(不需要中间 LIFO 存储)。但对我来说,它看起来像是递归可以正常工作并且看起来更具可读性的情况之一。

于 2013-09-15T17:26:11.687 回答