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

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

方法1:
 1 #include <iostream>
 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!"<<endl;
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<rowSize; ++i)     // outer-loop traverse down the "rows"
23     {
24          for(j=0; j<colSize; ++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="<<index<<endl;
31             cout<<"i(row)="<<i<<"j(col)="<<j<<"array value"<<pArray[index]<<endl;
32             ++arrayValue;
33         }
34     }
35 
36      // output the array
37      for( int k=0; k<totalSize; ++k)
38     {
39         cout<<pArray[k]<<endl;
40     }
41     cout<<"The End"<<endl;
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"<<endl;
 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<rowSize; ++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<rowSize; ++i)
25     {
26          for(j=0; j<colSize; ++j)
27         {
28             pPointerArray[i][j]=arrayValue;     // cool
29             cout<<"i(row)="<<i<<"j(col)="<<j<<"array value="<<pPointerArray[i][j]<<endl;
30             ++arrayValue;
31         }
32     }
33 
34          // output the array
35      for( int k=0; k<totalSize; ++k)
36     {
37         cout<<pArray[k]<<endl;
38     }
39     cout<<"The End!"<<endl;
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<rowSize; ++i)     // assign the address of each row to pointerArray(the header)
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"<<endl;
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<rowSize; ++i)
29          for(j=0; j<colSize; ++j)
30             p[i][j]=arrayValue++;
31     
32      // output values
33      for(i=0; i<rowSize; ++i)
34          for(j=0; j<colSize; ++j)
35             cout<<p[i][j]<<endl;
36 
37      free(( void *)p);
38 }

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

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

你可能感兴趣的:(C/C++ 2D数组的动态分配方法比较)