转自http://blog.csdn.net/dualeak/article/details/4677132
讲的很好!
假设我需要一个nrows、 ncolumns数组,则可以用以下几种方法动态分配空间:
1. 动态数组的成员都可以用正常的数组下标 Array[i][j]
- #include <stdio.h>
- #include <stdlib.h>
- void main()
- {
- int nrows,ncolumns;
- int **Array;
- int i,j;
- printf("please input nrows&ncolumns:/n");
- scanf("%d%d",&nrows,&ncolumns);
- Array=(int **)malloc(nrows*sizeof(int *));
- for(i=0;i<nrows;i++)
- Array[i]=(int *)malloc(ncolumns*sizeof(int));
- for(i=0;i<nrows;i++)
- {
- for(j=0;j<ncolumns;j++)
- {
- Array[i][j]=1;
- printf("%d ",Array[i][j]); //动态数组的成员都可以用正常的数组下标 Array[i][j]
- }
- printf("/n");
- }
- free(Array);
- }
2. 让数组的内容连续, 但在后来重新分配列的时候会比较困难, 得使用一点指针算术:
- #include <stdio.h>
- #include <stdlib.h>
- void main()
- {
- int nrows,ncolumns;
- int **Array;
- int i,j;
- printf("please input nrows&ncolumns:/n");
- scanf("%d%d",&nrows,&ncolumns);
- Array=(int **)malloc(nrows*sizeof(int *));
- Array[0]=(int *)malloc(nrows*ncolumns*sizeof(int));
- for(i=1;i<nrows;i++)
- Array[i]=Array[0]+i*ncolumns;
- for(i=0;i<nrows;i++)
- {
- for(j=0;j<ncolumns;j++)
- {
- Array[i][j]=1;
- printf("%d ",Array[i][j]); //动态数组的成员都可以用正常的数组下标 arrayx[i][j]
- }
- printf("/n");
- }
- free(Array);
- }
3. 同一个单独的动态分配的一维数组来模拟二维数组:
- #include <stdio.h>
- #include <stdlib.h>
- void main()
- {
- int nrows,ncolumns;
- int *Array;
- int i,j;
- printf("please input nrows&ncolumns:/n");
- scanf("%d%d",&nrows,&ncolumns);
- Array=(int *)malloc(nrows*ncolumns*sizeof(int *));
- for(i=0;i<nrows;i++)
- {
- for(j=0;j<ncolumns;j++)
- {
- Array[i*nrows+j]=1;
- printf("%d ",Array[i*nrows+j]); //用 array3[i * ncolumns + j] 访问第 i, j 个成员
- }
- printf("/n");
- }
- free(Array);
- }