C 在函数外部使用三维数组

C 在函数外部使用三维数组,c,arrays,multidimensional-array,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(i

我有一个函数,其中我制作了一个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]);

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

不可能分配数组。您还使用了错误的参数类型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]);
}

分配三维阵列有两种不同的方法。您可以将其作为一维指针数组分配给一维数组的一维指针数组。这可以通过以下方式完成:

 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));
          }

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

ARR(1,0,3) = 4;

您不想将指针传递到本地存储。当它超出范围时会被回收。改为使用malloc…、静态存储等。是否需要在堆栈或堆上进行分配?是否需要用数字填充本地数组,然后将本地数组的内容复制到作为参数传递的数组中?如果不使用本地数组,直接在作为参数传递的数组中输入数字会更容易。你能说明你想做什么吗,否则我们帮不上忙。@JanWrobel哪种方法都行。我只需要注意我只在函数中找到数组的第一个维度。问题是,在我的程序中,我只在assign_3D函数中找到arr=2的第一个维度。添加了一个部分专门解决这个问题。非常糟糕,甚至没有一个示例编译成功,没有错误。@self。现在我喜欢第二个例子,但是你应该考虑使用一个带有指针参数的函数,而不是宏,因为它使用了一个预定义的名称和GULL。如果像ARRi、i+1、i+3Macro那样使用它,它将无法正常工作。为了避免这种情况,它应该在每次使用它的参数时插入括号。最好使用内联函数而不是宏。不幸的是,您还没有理解C样式数组的全部功能。您不需要亲自经历分配指针数组或计算数组偏移量的麻烦。编译器可以为您执行此操作,您只需为它提供正确的类型。
 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;