创建一个复制3D数组内容的函数

时间:2019-01-13 17:45:57

标签: c arrays loops memory user-input

我正在尝试解决如何创建一个将内容从一个3D阵列复制到另一个3D阵列的功能,该功能必须是用户输入。我设法使程序处于一个主要功能之下,但是实现该功能的理想方式是通过具有两个或多个功能。

第一次尝试如下(即不正确-在一个主要功能中)

main()
{
    int x,y,z;
    printf("Enter x value.\n");
    scanf("%d", &x);
    printf("Enter y value.\n");
    scanf("%d", &y);
    printf("Enter z value.\n");
    scanf("%d", &z);



    printf("The size of the array is %d.\n", x*y*z);
    /* 3D array declaration*/
    int disp[x][y][z];
    int cpydisp[x][y][z];


    /*Counter variables for the loop*/
    int i, j, k;
    for(i=0; i<x; i++) {
        for(j=0;j<y;j++) {
            for (k = 0; k < z; k++) {
                printf("Enter value for disp[%d][%d][%d]:", i, j, k);
                scanf("%d", &disp[i][j][k]);
            }
        }
    }

    memcpy(cpydisp,disp, sizeof(disp));

    //Displaying array elements
    printf("Three Dimensional array elements:\n");
    for(i=0; i<x; i++) {
        for(j=0;j<y;j++) {
            for (k = 0; k < z; k++) {
                printf("%d ", cpydisp[i][j][k]);
            }
            printf("\n");
        }
    }

返回0; }

进行研究后,我发现的内容与我类似,它需要用户输入,但这是一维的,不会复制内容。 User input array size C

查看后,我当前正在尝试配置以下内容,但是当尝试打印出原始数组(甚至不是复制的数组)时,系统崩溃。

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

void printArray(int ***cpydisp,int x,int y,int z) {
    int i,j,k;
    printf("Three Dimensional array elements:\n");
    for(i=0; i<x; i++) {
        for(j=0;j<y;j++) {
            for (k = 0; k < z; k++) {
                printf("%d ", cpydisp[i][j][k]);
            }
            printf("\n");
        }
    }
}



void copy3d(size_t x, size_t y, size_t z, int d[x][y][z], int src[x][y][z]) {
    printf("s[%zu][%zu][%zu]\nSizes: d:%zu, d[]:%zu, d[][]:%zu, d[][][]:%zu\n\n",
           x, y, z, sizeof d, sizeof d[0], sizeof d[0][0], sizeof d[0][0][0]);
    // 'sizeof' on array function parameter 'src' returns
    //     size of 'int (*)[(sizetype)(y)][(sizetype)(z)]
    memcpy(d, src, sizeof d[0] * x);
}


int main(void) {
    int x,y,z;
    printf("Enter the size of the array:\n");
    scanf("%d", &x);
    printf("Enter the size of the array:\n");
    scanf("%d", &y);
    printf("Enter the size of the array:\n");
    scanf("%d", &z);

    // ask for enough memory to fit `count` elements,
    // each having the size of an `int`
    int ***array = malloc(x * y * z * sizeof(***array));

    int i, j, k;
    for(i=0; i<x; i++) {
        for(j=0;j<y;j++) {
            for (k = 0; k < z; k++) {
                printf("Enter value for display[%d][%d][%d]:", i, j, k);
                scanf("%d", &array[i][j][k]);
            }
        }
    }

    printArray(array, x, y, z);

    free(array);
}

预先感谢

1 个答案:

答案 0 :(得分:0)

不建议这样做...但是缺少的是分配给阵列的内存。对于我来说,我想把注意力集中在内存和多维数组上,我喜欢逐步地思考它们,并且它们也逐步地设置它们。因此,首先,您先分配列,然后分配行,等等。

因此,您可以使用它:

// get the columns mem sorted
int ***array = (int ***)malloc(y * sizeof(***array));

// loop through all the columns and give them enough mem for a row
for (int j = 0; j < y; j++) {
    array[j] = (int **)malloc(x * sizeof(**array));

    //loop through each row and give them them enough mem for z axis
    for (int i = 0; i < x; i++) {
        array[j][i] = (int *)malloc(x * sizeof(*array));
    }
}

int i, j, k;
for (i = 0; i < x; i++) {
    for (j = 0; j < y; j++) {
        for (k = 0; k < z; k++) {
            printf("Enter value for display[%d][%d][%d]:", i, j, k);
            scanf("%d", &array[i][j][k]);
        }
    }
}

这完成了所有操作,您可以访问成员。但这意味着在程序结束时,您需要再次执行循环,而不是malloc,您需要释放所有这些元素。同样,不建议这样做。阅读this或为自己省去一些麻烦simulate a 3d array