c/c++における動的申請二次元配列の実現

3295 ワード

#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('
'); } 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('
'); // } // // 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('
'); } delete[] pp_arr; return 0; }