C如何分配多维数组中的数据项的内存?
数据项在一个 多维数组中的数据项是以行和列的形式存储的。而且,分配给多维数组的内存是连续的。因此,多维数组中的元素可以用两种方法进行线性存储,即行-主要顺序 或列-主要顺序。
- 行的主要顺序:在行主顺序中,我们根据行来存储元素,即首先,我们将元素存储在第一行,然后是第二行,以此类推。因此,第一行的元素被线性地存储在内存中,然后是第二行,以此类推。在内存中,我们不会发现各行之间有任何分隔。
- 列为主的顺序。在存储数据项时,列主要顺序与行主要顺序相反,即在这里,我们首先将元素存储在第一列,然后是第二列,以此类推。所以在这种情况下,第一列的元素被线性地存储在内存中,然后是第二列,以此类推。
C语言 编译器使用Row major order方法来存储内存中的元素。基本上,C语言编译器将多维数组存储为单维数组,其元素为单维数组或维数比前者少1的多维数组。而这些数组对象的存储是以行为单位的。
多维数组的大小和内存分配。
多维数组中每个维度的大小都需要最初声明。然后, 多维数组的总大小是由每个维度的大小相乘而计算出来的。分配给多维数组的内存等于多维数组的大小和单个元素大小的倍数。
data_type array_name [ x1 ] [ x2 ] [ x3 ] .....[ xn ];
多维数组的大小 :- x1*x2*x3*.....*xn
其中 x1, x2, x3, ..., xn 是每个维度的大小。
分配的内存=多维数组的大小 * 单个数据类型的大小例如:-
int arr [ 3 ][ 4 ][ 2 ];
这个多维(3D)数组的大小是3*4*2 = 24
分配的内存 = 24 * 4字节 = 96字节
举例来说。
如下所示: int arr[3][3] = { {24, 15, 34}, {26, 134, 194}, {67, 23, 345}.}在内存中存储为:-

数据的分配
这里,基地址是多维数组的地址或存储在多维数组中的第一个对象的地址。内存地址增加4个字节(int数据类型的大小)。
下面是上述概念的实现。
C
// C Program to show allocation of data items
// in multidimensional array
#include <stdio.h>
#include <stdlib.h>
int main()
{
// Declaring the dimension of
// 2-Dimension array
int row = 3;
int col = 3;
// Creating an array arr with size row*col
int* arr = (int*)malloc(row * col * sizeof(int));
int k = 1;
// Inserting values in the array
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
// The memory address of arr[i][j]
// is equal to (arr + i*col + j)
*(arr + i * col + j) = k;
k++;
}
}
// Printing the multidimensional array
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d ", *(arr + i * col + j));
}
printf("\n");
}
return 0;
}
输出
1 2 3
4 5 6
7 8 9
上面的代码实现显示了元素是如何按行主顺序线性存储的。