在函数外部使用3d数组

时间:2014-04-21 12:06:42

标签: c arrays multidimensional-array

我有一个函数,我在其中制作3D数组并填写所有值。我还必须传递一个指向该函数的指针,该函数将3D数组的内存位置分配给该函数,以便可以在该函数之外使用它。目前,我正在做一些似乎不起作用的事情,有人可以指导我达到最佳解决方案吗?

int (*arr)[4];

void assign_3D(int (*arr)[4]) 
{
    int local[2][3][4]; //probably we should pass *local?
    memset(local, 0, sizeof(int)*2*3*4);    // fill the local array with numbers

    arr = local; 
}

printf("%d\n", arr[1][2][3]);

我知道我上面写了可怕的代码。但我正在学习:)。

2 个答案:

答案 0 :(得分:1)

无法分配数组。您也使用了错误的类型参数(int (*)[5]不是int [2][3][4]衰变的,使用int (*)[3][4]作为参数类型)。获得正确的类型后,您可以使用memcpy()进行分配:

#include <string.h>
#include <stdio.h>

int arr[2][3][4];

void assign_3D(int (*arr)[3][4]) {
    int local[2][3][4];
    memset(local, 0, sizeof(local));   //pass local here, because it is not a pointer but an array. Passing *local would only initialize the first element of the array, i. e. the first 2D slice of it.
    // fill the local array with numbers

    memcpy(arr, local, sizeof(local));
}

int main() {
    assign_3D(arr);
    printf("%d\n", arr[1][2][3]);
}

但您也可以从函数中返回一个新分配的数组:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

typedef int arrayType[2][3][4];

arrayType* create_3D() {
    arrayType* result = malloc(sizeof(*result));    //here we need to dereference because result is a pointer and we want memory for the array, not the pointer.
    memset(result, 0, sizeof(*result));
    (*result)[1][2][3] = 7;    // fill the local array with numbers

    return result;    //that's easy now, isn't it?
}

int main() {
    arrayType* array = create_3D();
    printf("%d\n", (*array)[1][2][3]);

    free(array);    //cleanup
}        

编辑:
您提到在运行函数之前不知道第一维的大小。在这种情况下,您必须使用malloc()方法,但有点不同:

#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

typedef int sliceType[3][4];

sliceType* create_3D(size_t* firstDimSize) {
    *firstDimSize = 2;
    size_t arraySize = *firstDimSize*sizeof(sliceType);

    sliceType* result = malloc(arraySize);
    memset(result, 0, arraySize);

    result[1][2][3] = 7;    // fill the local array with numbers

    return result;
}

int main() {
    size_t firstDim;
    sliceType* array = create_3D(&firstDim);
    printf("%d\n", array[1][2][3]);

    free(array);    //cleanup
}

答案 1 :(得分:-1)

分配3D阵列有两种不同的方法。您可以将其分配为指向(1D数组指针的1D数组)指针的一维数组。这可以按如下方式完成:

 int dim1, dim2, dim3;
 int i,j,k;
 int *** array = (int ***)malloc(dim1*sizeof(int**));

        for (i = 0; i< dim1; i++) {

         array[i] = (int **) malloc(dim2*sizeof(int *));

          for (j = 0; j < dim2; j++) {

              array[i][j] = (int *)malloc(dim3*sizeof(int));
          }

        }

有时将数组分配为连续的块更合适。您会发现许多现有库可能要求阵列存在于已分配的内存中。这样做的缺点是,如果你的数组非常大,你可能在内存中没有这么大的连续块。

const int dim1, dim2, dim3;  /* Global variables, dimension*/

#define ARR(i,j,k) (array[dim2*dim3*i + dim3*j + k])
int * array = (int *)malloc(dim1*dim2*dim3*sizeof(int));

要访问您的阵列,您只需使用宏:

ARR(1,0,3) = 4;