在C中动态声明各种2D数组

时间:2016-09-20 09:57:18

标签: c arrays

我必须声明Rx3的C大小的三个二维数组,称为array1,array2和sum。

int main() 
{
  int row = 0;
  printf("Enter the no. of rows:");
  scanf("%d", &row);
  printf("MyArray[%d][3]", row);

  int ** array1;
  array1 = (int**)malloc(4 * row);
  int rep1;
  for (rep1 = 0; rep1 <= row; rep1++) 
  {
    array1[rep1] = (int*)malloc(3 * 4);
  }

  int ** array2;
  array2 = (int**)malloc(4 * row);
  int rep2;
  for(rep2 = 0; rep2 <= row; rep2++)
  {
    array2[rep2] = (int**)malloc(3 * 4);    
  }
}

但是这段代码不起作用,我如何添加第三个数组

2 个答案:

答案 0 :(得分:1)

array1 = (int**)malloc(4*row);

这里4是什么?它是sizeof(int)硬编码还是列数?

要为具有固定宽度的2D阵列预留空间,您可以使用:

#define COLS 4

int (*arr)[COLS]; /* A pointer to an array of n int's */
size_t nrows = user_input();

arr = malloc(sizeof(*arr) * nrows);

如果您事先不知道列数,可以使用Variable Length Array(自C99起):

size_t ncols = user_input();    
int (*arr)[ncols]; /* VLA */
size_t nrows = user_input();

arr = malloc(sizeof(*arr) * nrows);
  

如何添加第三个数组?

size_t ncols = user_input();    
int (*arr1)[ncols];
int (*arr2)[ncols];
int (*arr3)[ncols];
size_t nrows = user_input();

arr1 = malloc(sizeof(*arr1) * nrows);
arr2 = malloc(sizeof(*arr2) * nrows);
arr3 = malloc(sizeof(*arr3) * nrows);

或者如果你喜欢大块:

size_t ncols = user_input();    
int (*arr)[ncols];
size_t nrows = user_input();

arr = malloc(sizeof(*arr) * nrows * 3);

int (*arr1)[ncols] = arr;
int (*arr2)[ncols] = arr + rows;
int (*arr3)[ncols] = arr + rows * 2;

通过这种方式,一个简单的free(arr);就足够了。

答案 1 :(得分:0)

此代码在GCC编译器中正常工作。

#include <stdio.h>
#include <stdlib.h>
int main()
{
        int row=0;
        printf("Enter the no. of rows:");
        scanf("%d", &row);

        printf("MyArray[%d][3]",row);
        int **array1 = (int**)malloc(sizeof(int*)*row);
        int rep1;

        for (rep1 = 0; rep1 <= row; rep1++)
        {
                array1[rep1] = (int*)malloc(3*sizeof(int));
        }

        int ** array2;

        array2 = (int**)malloc(sizeof(int*)*row);
        int rep2;

        for(rep2 = 0; rep2 <= row; rep2++)
        {
                array2[rep2] = (int*)malloc(3*sizeof(int));
        }
}