C/C++ 2D数组的动态分配方法比较
方法1:
方法2:
方法3:
方法3,我感觉最好,只调用一次malloc, 空间连续,释放内存也比较方便。
大家有什么想法的欢迎交流
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 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 }
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 }
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, 空间连续,释放内存也比较方便。
大家有什么想法的欢迎交流