如何在一个分配C中动态分配2D数组

xpcnnkqh  于 2023-11-16  发布在  其他
关注(0)|答案(3)|浏览(127)

你能帮我弄清楚如何在一个分配调用中分配一个2D数组吗?
我试着去做:
int n =(int n)malloc(int n);
但它不工作。
num是行和列。

jtjikinw

jtjikinw1#

如何在1中动态分配array2D分配C
让我们从什么是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。有时,这通常是人们想要的“分配2D”数组,实际上是指向1D数组的指针

int (*arr4)[8] = malloc(sizeof *arr4 * 7);
 arr4[0][0] = this;

 // or
 int (*arr5)[num] = malloc(sizeof *arr5 * num);
 arr5[0][0] = that;

egdjgwm8

egdjgwm82#

您可以通过以下两种方式之一分配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现在将指向一个指针列表,每个指针代表一行,这些指针将指向该行中的元素。

2:单个连续块

这可能是你想要的方法,你可以在一次分配中完成所有的操作。这需要你将2D数组存储在1D表示中。

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


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

5us2dqdw

5us2dqdw3#

虽然我认为“2D整数数组”的含义是明确的,比如int arr[10][10],但在网上搜索时会出现“使用指针数组”或“使用指向指针的指针”之类的解释。(参见,例如,this post)。这个答案的其余部分基于int arr[r][c]形式的2D数组,其中r表示行数,c表示每行的列数。
如果不支持可变长度数组,那么至少c必须是一个常量表达式(即在编译时已知)。相反,r也可以在运行时定义,这样至少行数是“动态的”。2D数组可以表示为一维数组的数组(可能不完整):

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

字符串

相关问题