首页 文章

如何在一个分配C中动态分配二维数组

提问于
浏览
-1

你能帮我弄清楚如何在一次分配呼叫中分配2D阵列吗?

我试着这样做:

int ** arr =(int **)malloc(num * num * sizeof(int *));

但它不起作用 .

num 是行和列 .

3 回答

  • 0

    我如何在1中分配C动态分配array2D

    让我们从什么是2D数组开始:
    2D array or "array 3 of array 4 of int"的示例

    int arr1[3][4];
    arr1[0][0] = this;
    

    OP的代码声明pointer to pointer to int,不是2D数组,也不是指向2D数组的指针 .
    顺便说一句,演员不需要 .

    int** arr = (int**)malloc(num * num * sizeof(int*));
    

    代码可以为2D数组分配内存并返回指向该内存的指针 . pointer to array 5 of array 6 of int

    int (*arr2)[5][6] = malloc(sizeof *arr2);
     if (arr2 == NULL) return EXIT_FAILURE;
     (*arr2)[0][0] = this;
     return EXIT_SUCCESS;
    
     // or with Variable Length Arrays in C99 and optionally in C11
     int (*arr3)[num][num] = malloc(sizeof *arr3);
     (*arr3)[0][0] = that;
    

    或者,代码可以为1D数组分配内存并返回指向该内存的指针 . pointer to array 8 of int . 有时这通常是一个人想要的"allocate 2D"数组,实际上是指向一维数组的指针

    int (*arr4)[8] = malloc(sizeof *arr4 * 7);
     arr4[0][0] = this;
    
     // or
     int (*arr5)[num] = malloc(sizeof *arr5 * num);
     arr5[0][0] = that;
    
  • 4

    虽然我认为"2D-array of integers"的含义明确地类似于 int arr[10][10] ,但在网上搜索却带来了"using an array of pointers"或"using a pointer to a pointer"等解释(例如,参见this post) . 此答案的其余部分基于 int arr[r][c] 形式的2D数组,其中 r 表示行数, c 表示每行的列数 .

    如果不支持可变长度数组,则至少 c 必须是const表达式(即在编译时已知) . 相反, r 也可以在运行时定义,使得至少行数是"dynamic" . 然后可以将2D数组表示为一个D数组的(可能是不完整的)数组:

    #define COLS 3
    
    void printArray(int array[][COLS], int rows) {
        for(int row=0; row<rows; row++) {
            for (int col=0; col<COLS; col++) {
                printf("%d ", array[row][col]);
            }
            printf("\n");
        }
    }
    
    int main() {
    
        typedef int oneD[COLS];
    
        int rows = 5;
        size_t myArray5RowsSize = rows*sizeof(oneD);
        oneD *myArray5Rows = malloc(myArray5RowsSize);
        memset(myArray5Rows,0,myArray5RowsSize);
        myArray5Rows[0][0] = 0;
        myArray5Rows[1][1] = 1;
        myArray5Rows[2][2] = 2;
    
        printArray(myArray5Rows, 5);
    
        return 0;
    }
    
  • 0

    您可以使用以下两种方式之一分配2D阵列 .

    1:指向数组的指针数组

    这将是:

    int rows = 10; 
    int cols = 10;
    int **array = malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = malloc(cols * sizeof(int));
    }
    

    array 现在将指向每个表示一行的指针列表,这些指针将指向行中的元素 . 在这种情况下,您可以使用 array[n][m] 访问第n行和第m列

    2:单个连续块

    这可能是您想要的方法,您可以在一次分配中完成所有操作 . 这将要求您以二维表示形式存储二维数组 .

    int rows = 10; 
    int cols = 10;
    int *array = malloc(rows * cols * sizeof(int));
    

    然后,您可以使用偏移量存储和检索第n行和第m列: array[(n * cols) + m]

相关问题