今天心血来潮写个创建和析构二维数组的模板函数,可是万万没想到掉进坑里面
#include <iostream>
#include <cstdio>
template<typename T>
bool init2DArray(T ** ,const int &, const int &, const T & = 0);
template<typename T>
void destroy2DArray(T **, const int &);
int main()
{
char **pCArr = NULL;
init2DArray(pCArr, 10, 3, 'a');
std::cout << "p Address : " << pCArr << std::endl;
for(int i = 0; i < 10; i ++)
{
for(int j = 0; j < 3; j ++)
{
printf("%d %d %d\n", i, j, pCArr[i][j]);
}
}
destroy2DArray(pCArr, 10);
system("pause");
}
template<typename T>
bool init2DArray(T ** pArr, const int & row, const int & col, const T & defaultV)
{
destroy2DArray(pArr, row);
pArr = new T * [row];
if(pArr != NULL)
{
for(int i = 0 ; i < row; i ++)
{
pArr[i] = NULL;
pArr[i] = new T [col];
if(pArr[i] != NULL)
{
for(int j = 0; j < col; j ++)
{
pArr[i][j] = defaultV;
printf("%d %d %d\n", i, j, pArr[i][j]);
}
}
}
}
std::cout << "p Address : " << pArr << std::endl;
return pArr == NULL ? 0 : 1;
}
template<typename T>
void destroy2DArray(T ** pArr, const int & row)
{
if(pArr != NULL)
{
for(int i = 0; i < row; i ++)
{
if(pArr[i] != NULL)
{
delete []pArr[i];
pArr[i] = NULL;
}
}
delete []pArr;
pArr = NULL;
}
}
心想万无一失的,可是在main函数内部使用二维数组的指针频频error,百思不得其解
所以我就打印出申请空间前后的指针地址,一看果断问题大了,创建之后的数组指针是0x0
于是乎,have a try,脑子不知道怎么想的,我就稍稍加了个引用,于是乎
#include <iostream>
#include <cstdio>
template<typename T>
bool init2DArray(T ** & ,const int &, const int &, const T & = 0);
template<typename T>
void destroy2DArray(T **, const int &);
int main()
{
char **pCArr = NULL;
init2DArray(pCArr, 10, 3, 'a');
std::cout << "p Address : " << pCArr << std::endl;
for(int i = 0; i < 10; i ++)
{
for(int j = 0; j < 3; j ++)
{
printf("%d %d %d\n", i, j, pCArr[i][j]);
}
}
destroy2DArray(pCArr, 10);
system("pause");
}
template<typename T>
bool init2DArray(T ** & pArr, const int & row, const int & col, const T & defaultV)
{
destroy2DArray(pArr, row);
pArr = new T * [row];
if(pArr != NULL)
{
for(int i = 0 ; i < row; i ++)
{
pArr[i] = NULL;
pArr[i] = new T [col];
if(pArr[i] != NULL)
{
for(int j = 0; j < col; j ++)
{
pArr[i][j] = defaultV;
printf("%d %d %d\n", i, j, pArr[i][j]);
}
}
}
}
std::cout << "p Address : " << pArr << std::endl;
return pArr == NULL ? 0 : 1;
}
template<typename T>
void destroy2DArray(T ** pArr, const int & row)
{
if(pArr != NULL)
{
for(int i = 0; i < row; i ++)
{
if(pArr[i] != NULL)
{
delete []pArr[i];
pArr[i] = NULL;
}
}
delete []pArr;
pArr = NULL;
}
}
顿时脑洞大开,习惯了对二维数组操作使用指针,忘记了指针只是名字而不是人的事实