C/C++ 2D数组的动态分配方法比较

2014-11-24 12:12:40 · 作者: · 浏览: 0

方法1:
1 #include
2 using namespace std;
3
4 //by snape 2012-3-25
5 //method 1: drawback is we need calculate the one-dimensional index to access the 2D array
6 int main()
7 {
8 int rowSize, colSize, totalSize;
9 int index, i,j;
10
11 cout<<"Enter the row and column size for your 2D array!"< 12 cin>>rowSize>>colSize;
13
14 totalSize=rowSize*colSize;
15 int *pArray;
16 pArray=new int[totalSize];
17
18 //file the array with integers from 0 to totalsize
19 //file across the rows, moving down the colums
20
21 int arrayValue=0;
22 for(i=0; i 23 {
24 for(j=0; j 25 {
26 //caculate array index
27 //index=rowSize*j+i; //both index=rowSize*j+i; and index=colSize*i+j; are ok
28 index=colSize*i+j; //but if index=rowsize*i+j; or index=colSize*j+i; then there will be a bug.
29 pArray[index]=arrayValue; // i like index=colSize*i+j; since the arrange of 2D is according to rows
30 cout<<"index="< 31 cout<<"i(row)="< 32 ++arrayValue;
33 }
34 }
35
36 //output the array
37 for(int k=0; k 38 {
39 cout< 40 }
41 cout<<"The End"< 42 delete [] pArray;
43 return 0;
44 }
45
46

方法2:
1 //by snape
2 //method 2: better than method 1, but call new twice
3 int main()
4 {
5 int rowSize, colSize, totalSize;
6 int i, j;
7 cout<<"Enter the row and column size for your 2D array"< 8 cin>>rowSize>>colSize;
9
10 totalSize=rowSize*colSize;
11
12 int *pArray; //pointer to an integer
13 int **pPointerArray; //pointer to an integer pointer
14
15 pArray=new int[totalSize]; //memory for totalSize integers
16 pPointerArray=new int*[rowSize]; //memory for rowSize # of int pointers
17
18 //fill the pointer array with the pArray[i][0] address
19 for(i=0; i 20 pPointerArray[i]=pArray+i*colSize; //place the address into the pointer
21
22 //now fill the pArray by using the pPointerArray to access elements
23 int arrayValue=0;
24 for(i=0; i 25 {
26 for(j=0; j 27 {
28 pPointerArray[i][j]=arrayValue; //cool
29 cout<<"i(row)="< 40 delete [] pArray;
41 delete [] pPointerArray;
42 return 0;
43 }

方法3:
1 // by snape
2 //method 3: better than method 2. just malloc once and the memory is contiguous block. the best
3 int **my2DAlloc(int rowSize, int colSize)
4 {
5 int i;
6 int header=rowSize * sizeof(int *);
7 int data=rowSize * colSize * sizeof(int);
8 int **rowptr=(int **)malloc(header+data); //malloc memory for both data and pointerArray(the header)
9
10 if(rowptr==NULL)
11 return NULL;
12 int *buf=(int *)(rowptr+rowSize); //buf: the pointer to the first data
13 for(i=0; i 14 rowptr[i]=buf+i*colSize;
15
16 return rowptr;
17 }
18
19 int main()
20 {
21 cout<<"Enter the row and column size for your 2D array"< 22 int rowSize, colSize;
23 cin>>rowSize>>colSize;
24 int **p=my2DAlloc(rowSize, colSize);
25
26 //assign values
27 int i, j, arrayValue=0;
28 for(i=0; i 29 for(j=0; j 30 p[i][j]=arrayValue++;
31
32 //output values
33 for(i=0; i 34 for(j=0; j 35 cout< 36
37 free((void *)p);
38 }

方法3,我感觉最好,只调用一次malloc, 空间连续,释放内存也比较方便。

大家有什么想法的欢迎交流

摘自 chenglong7997