我们会展示为二维数组分配连续内存的两种方法。第一种首先分配“外层”数组,然后是各行所需的所有内存。第二种一次性分配所有内存。
下面的代码片段演示了第一种技术,第一个malloc
分配了一个整数指针的数组,一个元素用来存储一行的指针,这就是下图中在地址500处分配的内存块。第二个malloc
在地址600处为所有的元素分配内存。在for
循环中,我们将第二个malloc
所分配的内存的一部分赋值给第一个数组的每个元素。
我们会展示为二维数组分配连续内存的两种方法。第一种首先分配“外层”数组,然后是各行所需的所有内存。第二种一次性分配所有内存。
下面的代码片段演示了第一种技术,第一个malloc
分配了一个整数指针的数组,一个元素用来存储一行的指针,这就是下图中在地址500处分配的内存块。第二个malloc
在地址600处为所有的元素分配内存。在for
循环中,我们将第二个malloc
所分配的内存的一部分赋值给第一个数组的每个元素。
从技术上讲,第一个数组的内存可以和数组“体”的内存分开,为数组“体”分配的内存是连续的。
下面是第二种技术,数组所需的所有内存是一次性分配的:
分配的情况如下图所示。
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
*(matrix + (i*columns) + j) = i*j;
}
}
不能使用数组下标是因为我们丢失了允许编译器使用下标所需的“形态”信息。这个概念在4.8节讲过了。
实际项目中很少使用这种方法,但它确实说明了二维数组概念和内存的一维本质的关系。便捷的二维数组表示法让这种映射变得透明且更容易使用。
我们已经演示了为二维数组分配连续内存的两种方法,具体使用哪种要看应用程序的需要。不过第二种方法是为“整个”数组分配一块内存。