我有一个函数,我在其中创建一个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("%dn", 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("%dn", 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("%dn", (*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("%dn", array[1][2][3]);
free(array); //cleanup
}
分配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;