在C中复制3D数组的函数?

时间:2019-01-10 10:51:17

标签: c arrays for-loop multidimensional-array memcpy

嗨,我在教科书中偶然发现一个问题:“写一个函数,该函数可以复制3D整数数组的内容。该功能应支持任何3D数组大小。'

在与我的讲师讨论之后,他指定该函数的原型应类似于此(这是2D,我需要3D)。

int sum2d(int rows, int cols, int ar[rows][cols]);

现在,通过在main函数中制作所有内容,我目前的编码方式是这样的,它应按应有的方式工作,即复制所有内容等。

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

        int *arrx = malloc(x * sizeof(*arrx));
        int *arry = malloc(y * sizeof(*arry));
        int *arrz = malloc(z * sizeof(*arrz));



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

但是,这是不正确的,因为我需要实现仅用于复制的功能,所以我想到了这一点。创建一个名为void array_copy的函数,该函数实际上由memcpy将数组disp的内容复制到另一个数组cpydisp。然后在主函数中调用函数array_copy,但这不起作用。

       int i, j, k;
        int x,y,z;
        int disp[x][y][z];
        int cpydisp[x][y][z];


void array_copy() {

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

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

        //int *arrx = malloc(x * sizeof(*arrx));
        //int *arry = malloc(y * sizeof(*arry));
        //int *arrz = malloc(z * sizeof(*arrz));



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

        /*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]);
                }
            }
        }

        array_copy();

    }

任何人都想知道如何修复它,因为当用户在开始任何操作之前先估算出想要的尺寸时,它似乎可以占用任何尺寸时,我似乎无法理解它的问题。

预先感谢

编辑:

#include<stdio.h>
#include <string.h>
int x,y,z;
int i, j, k;

void user_input(){

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


void array_copy() {

    int disp[x][y][z];
    int cpydisp[x][y][z];

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


int main()
{
    user_input();
    int disp[x][y][z];
    int cpydisp[x][y][z];

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

    /*Counter variables for the loop*/
    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]);
            }
        }
    }

    array_copy();

}

我已经以这种方式重试了,现在正在输出某些内容,而不是第二次尝试,但是输出只是随机数。即:

Enter x value.
1

Enter y value.
2

Enter z value.
3

The size of the array is 6.

Enter value for disp[0][0][0]:1
1
Enter value for disp[0][0][1]:2
2
Enter value for disp[0][0][2]:3
3
Enter value for disp[0][1][0]:4
4
Enter value for disp[0][1][1]:5
5
Enter value for disp[0][1][2]:6
6
Three Dimensional array elements:
797168 0 6421264
0 3 0

Process finished with exit code 0

正确的输出应为1,2,3,4,5,6

再次感谢

2 个答案:

答案 0 :(得分:0)

鉴于您有一个实际的3D阵列,该函数很简单:

memcpy( dst, src, sizeof(int[x][y][z]) ); 

如果出于学习目的,您想自己编写一个效率较低的版本,则如下所示:

void copy (size_t x, size_t y, size_t z, int dst[x][y][z], int src[x][y][z])
{
  for(size_t i=0; i<x; i++)
    for(size_t j=0; j<y; j++)
      for(size_t k=0; k<z; k++)
        dst[i][j][k] = src[i][j][k];
}

代码不起作用的原因是因为您使用了可变长度数组(VLA),但在文件范围(“全局”)中声明了它们,这是不允许的。必须在本地范围内声明VLA,并且必须在声明VLA之前将数组边界设置为有效值。

上面的代码不在乎3D数组的分配方式,而是将其留给调用者。

答案 1 :(得分:0)

  

编写一个函数,该函数可以复制3D整数数组的内容。该功能应支持任何3D数组大小

     

类似

     

int sum2d(int rows, int cols, int ar[rows][cols]);

OP使用全局variable-length array (VLA)的方法失败,因为在文件范围内不允许使用VLA。

VLA不能初始化(在声明时给定值)。但是,可以在运行时分配它们的元素。


有了VLA d[x][y][z](在C99和C11中可选),使用memcpy()很容易。
在函数内,使用大小:sizeof d[0] * x

memcpy(d, src, sizeof d[0] * x);

实施说明:

s, d是指针。

size_t是一些无符号类型,它是用于处理大小和数组索引的正确宽度。 int可能太窄了。

使用int d[x][y][z]作为参数,尺寸信息x丢失。
x可能被编译器用于选择优化和检查,但是代码将d视为类型int (*)[y][z]

#include <stddef.h>

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

样品用量

#include <stdio.h>

int main(void) {
  size_t x = (unsigned) rand() % 4 + 1;
  size_t y = (unsigned) rand() % 4 + 1;
  size_t z = (unsigned) rand() % 4 + 1;
  int src[x][y][z];
  int i = 0;

  for (size_t xi = 0; xi < x; xi++) {
    for (size_t yi = 0; yi < y; yi++) {
      for (size_t zi = 0; zi < z; zi++) {
        src[xi][yi][zi] = ++i;
      }
    }
  }

  int dest[x][y][z];
  // Call with two 3D: dest, and src, along with dimension info.
  copy3d(x, y, z, dest, src);

  for (size_t xi = 0; xi < x; xi++) {
    printf("{");
    for (size_t yi = 0; yi < y; yi++) {
      printf("{");
      for (size_t zi = 0; zi < z; zi++) {
        printf("%2d ", dest[xi][yi][zi]);
      }
      printf("}, ");
    }
    printf("}\n");
  }
}

输出

s[2][4][3]
Sizes: d:8, d[]:48, d[][]:12, d[][][]:4

{{ 1  2  3 }, { 4  5  6 }, { 7  8  9 }, {10 11 12 }, }
{{13 14 15 }, {16 17 18 }, {19 20 21 }, {22 23 24 }, }