其实大部分还是引用的http://blog.youkuaiyun.com/morewindows/article/details/7664479这篇文章上面的第二部分
不过分配内存,使用了c++对应的new,和windows下面的HeapAlloc
原理其实就是下面的一个图:
确实就如该文章所说,还少一个对应二维string数组的情况。
但目前没有需要用到,用的是和再回来看看。
很多情况下都是用的Verctor,不过一般的面试笔试题还是用的数组结构较多
以下代码,通过g++ 4.7.2版本和vs2012、2010编译成功
// test2.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include "stdio.h"
#include "iostream"
//#include "MemCheck.h" // Must appear last!
#include "string.h"
#ifdef _WIN32
#include "windows.h"
#endif
//////////////////////////////////////////////////////////////////////////
/************************************************************************/
/*
如果使用一位数组代替二维数组,是个不错的选择
比如下面的代码:
T *arr=new T[col*rol];
arr(col*i+j)=k //代替arr[i][j]=k,
delete[] arr;
*/
/************************************************************************/
//////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//
//函数:MallocArray2D(int row, int col)
//
//目的:分配和释放二维十足
//
//注释:参数:二维数组行和列的个数
//
///////////////////////////////////////////////////////////////////
#ifdef _WIN32
HANDLE hHeap;
#endif
template<typename T>
T** NewArray2D(int row, int col)
{
int size = sizeof(T);
int point_size = sizeof(T *);
// 先申请内存,其中point_size * row表示存放row个行指针
#ifdef _WIN32
hHeap = ::HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
T **array = (T **)(::HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 4096 ));
#else
T **array = new T * [point_size * row + size * row * col];
#endif
if (array != NULL)
{
memset(array, 0, point_size * row + size * row * col);
T *head = (T *)((long)array + point_size * row);
while (row--)
{
array[row] = (T *)((long)head + row * col * size);
}
}
return (T **)array;
}
void DelArray2D(void **array)
{
if (array != NULL)
{
#ifdef _WIN32
if (hHeap)
{
::HeapFree(hHeap, HEAP_NO_SERIALIZE, array);
}
#else
delete array;
#endif
}
}
int main()
{
// TRACE_OFF();
// MEM_ON();
std::cout << "动态申请二维数组" << std::endl;
std::cout << "请输入行列(以空格分开): " << std::endl;
int row, col;
std::cin >> row;
std::cin >> col;
//动态申请连续的二维数组
int **p = NewArray2D<int>(row, col);
// 为二维数组赋值
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
p[i][j] = i + j;
}
}
// 输出二维数组
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
std::cout << p[i][j] << " ";
}
std::cout << std::endl;
}
DelArray2D((void **)p);
// MEM_OFF();
return 0;
}