c/c++中动态的申请二维数组的实现

#include "stdafx.h"
#include <iostream>
#include <new>
#include <string>
#include <cstdlib>

using namespace std;

//c++语言实现申请动态二维数组 new delete
template<class T>
T** new_Array2D(int row, int col)
{
	int size = sizeof(T);
	int point_size = sizeof(T*);
	//先申请内存空间,其中sizeof(T*)*row表示存放row个行指针
	T** arr = (T**)malloc(point_size*row + size*row*col);
	if (arr != NULL)
	{
		T *head = (T*)((int)arr + point_size*row);
		for (int i=0; i<row; i++)
		{
			arr[i] = (T*)((int)head + i*col*size);
			for (int j=0; j<col; j++)
			{
				new (&arr[i][j])T;
			}
		}
	}
	return (T**)arr;
}

//释放二组数组
template<class T>
void delete_Arrar2D(T** arr,int row, int col)
{
	for (int i=0; i<row; i++)
	{
		for (int j=0; j<col; j++)
		{
			arr[i][j].~T();
		}
	}
	if (arr != NULL)
	{
		free((void**)arr);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int nRow,nCol;
	//输入行和列数
	scanf("%d,%d",&nRow,&nCol);
	
	//动态申请连续的二维数组
	string**p = new_Array2D<string>(nRow, nCol);

	
	//赋值
	int i, j;
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<nCol; j++)
		{
			char szTemp[30];
			sprintf(szTemp,"%d",(i+1)*(j+1));
			p[i][j] = szTemp;
		}
	}
	
	//二维数组的输出
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<nCol; j++)
		{
			printf("%4s",p[i][j].c_str());
		}
		putchar('\n');
	}
	
	delete_Arrar2D<string>(p, nRow, nCol);
	return 0;
}
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

//申请二维数组 malloc free
template<typename T>
T** malloc_Array2D(int row, int col)
{
	int size = sizeof(T);
	int point_size = sizeof(T*);

	//先申请内存,其中point_size *row表示存放row个行指针
	T **arr = (T**)malloc(point_size*row + size*row*col);
	if (arr != NULL)
	{
		memset(arr,0, point_size*row + size*row*col);
		T *head  =(T*)((int)arr + point_size*row);
		while (row --)
		{
			arr[row] = (T*)((int)head + row*col*size);
		}
	}
	return (T**)arr;
}

//释放二组数组
void free_Array2D(void **arr)
{
	if (arr != NULL)
	{
		free(arr);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int nRow,nCol;
	//输入行和列数
	scanf("%d,%d",&nRow,&nCol);

	int **p = malloc_Array2D<int>(nRow, nCol);

	//赋值
	int i, j;
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<nCol; j++)
		{
			p[i][j] = (i+1)*(j+1);
		}
	}

	//二维数组的输出
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<nCol; j++)
		{
			printf("%4d",p[i][j]);
		}
		putchar('\n');
	}

	free_Array2D((void**)p);
}
#include "stdafx.h"
#include <iostream>
using namespace std;
//用C程序实现动态申请列大小固定的二维数组
int _tmain(int argc, _TCHAR* argv[])
{
	//列大小固定的二维数组可以申请一维数组并将指针强转成二维数组
	//列值固定
	const int MAXCOL = 3;

	int nRow;
	scanf("%d",&nRow);//输入一个行数

	//申请一维数据并将其转成二维数组指针
	int *pp_arr = new int[nRow*MAXCOL];
	int (*p)[MAXCOL] = (int(*)[MAXCOL])pp_arr;

	//为二维数组赋值
	int i, j;
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<MAXCOL;j++)
		{
			p[i][j] = (i+1)*(j+1);
		}
	}

	//二维数组的输出
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<MAXCOL; j++)
		{
			printf("%5d",p[i][j]);
		}
		putchar('\n');
	}

	delete[] pp_arr;
	return 0;
}


你可能感兴趣的:(c/c++中动态的申请二维数组的实现)