如何使用malloc将2d转换为3d数组?

时间:2019-09-27 14:05:22

标签: c arrays dynamic-memory-allocation

我正在研究一个功能简化程序项目,我正在考虑使用3d数组而不是两个2d数组

df <- structure(list(Product = structure(c(3L, 3L, 2L, 1L, 2L), .Label = c("CA", 
"CC", "TC"), class = "factor"), Client = structure(c(1L, 1L, 
1L, 2L, 3L), .Label = c("654", "666", "667"), class = "factor"), 
    TC = c(1, 1, 0, 0, 0), CC = c(0, 0, 1, 0, 1), CA = c(0, 0, 
    0, 1, 0)), .Names = c("Product", "Client", "TC", "CC", "CA"
), row.names = c(NA, -5L), class = "data.frame")

我尝试了

char *arr_input(int limit) {
    char *p = (char*)malloc(row*col*sizeof(char));  
    int i=0, num;
    zeroIn(p, limit);
    while (i < limit){
        scanf("%d", &num);             
        p[i*7+6] = num+48;                      
        i++;
    }
}

我不知道如何显示第二个2d数组或将值放在第二个数组中。 如果我认为有误,请对其进行编辑。

char *p=(char*)malloc(arr*row*col*sizeof(char)); 
/* arr means total number of 2d array
for eg, arr=2 means three 2d array of row,col.
*/

这有意义吗?

2 个答案:

答案 0 :(得分:1)

要创建一个指针,您可以将其用作char的三维数组并为其分配内存,请使用:

char (*p)[Rows][Columns] = malloc(Arrays * sizeof *p);

其中Arrays是二维数组的数量,Rows是行的数量,Columns是列的数量。

这声明p是指向Rows Columns的{​​{1}}个数组的指针。然后,它为指向类型的char个实例分配内存。

然后,您可以使用Array访问数组编号a,行编号r和列编号c中的元素。

通常,使用p[a][r][c]进行分配时,请使用malloc,其中malloc(NumberOfThings * sizeof *Pointer)NumberOfThings所指向类型的所需事物的数量。

使用Pointer而不是sizeof *Pointer或其他方式意味着如果您编辑sizeof(char)的类型,malloc中使用的大小将自动调整-不必要记住要在不同的地方进行多次编辑以保持代码的一致性。而且,这种格式意味着您不必遍历所有乘法就可以找出一列行的行中有多少Pointer,而您只需要向char索取最外面的类型。

在C中,将malloc的结果分配给指针时,无需强制转换。 (在C ++中,您可以。)

一个问题是函数不能返回可变地修改的类型。如果要让一个函数返回在此数组中分配的数组,则可能需要让该函数返回malloc并将调用函数将其分配给如上所述声明的指针。

答案 1 :(得分:0)

首先为顶部数组分配内存,并将其存储在基地址中。然后分配2d数组,然后分配2d数组每一行的1d数组。

解决方案1:

char ***threeDArray;

void initArray(int arr, int row, int col)
{
    threeDArray = (char***)malloc(arr * sizeof(char**));
    for (int i = 0; i < arr; i++)
    {
        threeDArray[i] = (char**)malloc(row*sizeof(char*));
        for (int j = 0; j < row; j++)
        {
            threeDArray[i][j] = (int*)malloc(col* sizeof(char));
            for (int k = 0; k < col; k++)
            {
                cahr input;
                printf("Enter a value for 3dArray[%d][%d][%d]", i, j, k);
                scanf("%c", &input);
                threeDArray[i][j][k] = input;
            }
        }
    }
}

解决方案2: 声明一个1d数组并将其像3d数组一样使用:

void initArray2(int arr, int row, int col)
{
    char *threeDArray = (cahr*)calloc(arr * row * col, sizeof(char));

    for (int i = 0; i < arr; i++)
    {
        for (int j = 0; j < row; j++)
        {
            for (int k = 0; k < col; k++)
            {
                char input;
                printf_s("Enter a value for 3dArray[%d][%d][%d]: ", i, j, k);
                scanf_s("%c", &input);
                *(threeDArray + (i*col) + (j*row) + k) = input;
            }
        }
    }
}