转自:http://blog.youkuaiyun.com/fqc0306/article/details/6686673
C语言提供类似于矩阵的多维数组,在一些进行数学运算的程序中会经常用到。从形式 上看多维数组是由多个一维数组组成的,但C语言处理多维数组的方法和一维数组一样,都是线性存储,连续分配存储空间,可以用带偏移量(offset)的一维数组来访问多维数组。而在数组规模不确定的情况下,就需要用malloc函数动态分配存储空间。这里的数组规模不确定指的是数组的维数确定,而每一维的元素个数是不确定的。例如根据用户输入的行数和列数来确定一个二维数组。
下面以二维数组为例,用两种方法分配存储空间。(以下程序在linux-2.6下gcc-4.41编译通过)
方法1.
- #include <stdio.h>
- #include <stdlib.h>
- #define Malloc(type,n) (type *)malloc((n)*sizeof(type))
- int main(int argc, char **argv)
- {
- int **array;
- int i,j,row, column;
- if(argc!=3)
- {
- printf("Run me with 2 parameters--rows & columns. For example:\n%s 3 4\nreturns 3 rows 4 columns array\n", argv[0]);
- exit(1);
- }
- row = atoi(argv[1]);
- column = atoi(argv[2]);
- array=Malloc(int *, row);
- for(i=0;i<row;i++)
- {
- array[i]=Malloc(int, column);
- }
- //validation
- for(i=0;i<row;i++)
- {
- for(j=0;j<column;j++)
- {
- array[i][j]=i;
- printf("%4d", array[i][j]);
- }
- printf("\n");
- }
- for(i=0;i<row;i++)
- free(array[i]);
- free(array);
- return 0;
- }
方法2.
- #include <stdio.h>
- #include <stdlib.h>
- #define Malloc(type,n) (type *)malloc((n)*sizeof(type))
- int main(int argc, char **argv)
- {
- int **array, *elements;
- int i,j,row, column;
- if(argc!=3)
- {
- printf("Run me with 2 parameters--rows & columns. For example:\n%s 3 4\nreturns 3 rows 4 columns array\n", argv[0]);
- exit(1);
- }
- row = atoi(argv[1]);
- column = atoi(argv[2]);
- array=Malloc(int *, row);
- elements=Malloc(int, row*column);
- j=0;
- for(i=0;i<row;i++)
- {
- array[i]=&elements[j];
- j+=column;
- }
- //validation
- for(i=0;i<row;i++)
- {
- for(j=0;j<column;j++)
- {
- array[i][j]=i;
- printf("%4d", array[i][j]);
- }
- printf("\n");
- }
- free(elements);
- free(array);
- return 0;
- }
方法1的好处是程序简单,容易理解,它首先对指向每一行的指针分配存储空间,然后将该指针指向列元素指针。注意最后要先后释放(free) array[n]和array。
- <pre class="c" style="font-family:monospace" name="code"><p>方法2的优点是可以对变长二维数组分配空间。一般情况下矩阵的行数容易得到,而每一行的元素个数可能不同(稀疏矩阵),方发2中element 是指向所有元素的指针,可处理变长的column。 </p>转载自<a href="http://xifage.com/">XiFage's Blog</a></pre>