C语言为二维数组分配连续内存

我们会展示为二维数组分配连续内存的两种方法。第一种首先分配“外层”数组,然后是各行所需的所有内存。第二种一次性分配所有内存。

下面的代码片段演示了第一种技术,第一个malloc分配了一个整数指针的数组,一个元素用来存储一行的指针,这就是下图中在地址500处分配的内存块。第二个malloc在地址600处为所有的元素分配内存。在for循环中,我们将第二个malloc所分配的内存的一部分赋值给第一个数组的每个元素。

int rows = 2;
int columns = 5;
int **matrix = (int **) malloc(rows * sizeof(int *));
matrix[0] = (int *) malloc(rows * columns * sizeof(int));
for (int i = 1; i < rows; i++)
    matrix[i] = matrix[0] + i * columns;

用两次<code>malloc</code>调用分配连续内存” title=”用两次<code>malloc</code>调用分配连续内存” /></p><div id=

从技术上讲,第一个数组的内存可以和数组“体”的内存分开,为数组“体”分配的内存是连续的。

下面是第二种技术,数组所需的所有内存是一次性分配的:

int *matrix = (int *)malloc(rows * columns * sizeof(int));

分配的情况如下图所示。

用一次<code>malloc</code>调用分配连续内存” title=”用一次<code>malloc</code>调用分配连续内存” /></p>
<p>后面的代码用到这个数组时不能使用下标,必须手动计算索引,如下代码片段所示。每个元素被初始化为其索引的积:</p>
<pre><code class=for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { *(matrix + (i*columns) + j) = i*j; } }

不能使用数组下标是因为我们丢失了允许编译器使用下标所需的“形态”信息。这个概念在4.8节讲过了。

实际项目中很少使用这种方法,但它确实说明了二维数组概念和内存的一维本质的关系。便捷的二维数组表示法让这种映射变得透明且更容易使用。

我们已经演示了为二维数组分配连续内存的两种方法,具体使用哪种要看应用程序的需要。不过第二种方法是为“整个”数组分配一块内存。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程