#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
// 申请的arr空间类似: #代表point *代表data; 那么他就是一个 4行5列的数据
// #***** #***** #***** #***** //这是本来应该存储的形态
// ####***** ***** ***** ***** //这是我们写出来的结构 那么解释一下
// 第一个# 即头指针arr, 第二个# 他指向了第第二组的头 即第二行的首元素 第三个#指向了第三行的首元素 第四个#同理
// head即第一个*的位置
// 二维数组 arr[i][j] 等价于 * ( arr + i ) + j; 又等价于 arr[i] + j; ( 此处arr[i]代表地址 )
template < typename TYPE >
TYPE ** new_Array_2D( int row, int col ) //row是行 col是列
{
int data_size = sizeof( TYPE ); //一个数据的空间
int point_size = sizeof( TYPE * ); //一根指针的空间
TYPE ** arr = ( TYPE ** ) malloc( point_size * row + data_size * row * col ); //申请了能存储列指针和所有数据空间的空间
if( arr != NULL ) //申请成功
{
TYPE * head = ( TYPE * )( arr + row ); //head指针指向数据开始位置的指针
for( int i = 0; i < row; i++ )
{
arr[i] = ( TYPE * )( ( int ) head + i * col * data_size ); //把arr[i]设置为指向行首地址的指针
for( int j = 0; j < col; j++ )
{
new ( & arr[i][j] ) TYPE; //T是指对arr[i][j]调用其构造函数 & arr[i][j]这个地地址会作为构造函数中this指针的内容
} // this指针即为date -> func() 等价于 func( &date ), 隐含传递了this;
} // 现在arr[i][j] 的地址即为这个数据的指针
}
return ( TYPE ** ) arr; //返回这个数组头指针
}
template < typename TYPE >
void delete_Array_2D( TYPE ** arr, int row, int col ) //释放二维数组 row行 col列
{
for( int i = 0; i < row; i++ ) //遍历整个数组
{
for( int j = 0; j < col; j++ )
{
arr[i][j].~TYPE(); //调用arr[i][j]的析构函数
}
}
if( arr != NULL )
{
free( ( void ** ) arr ); //删除整个arr数组 void代表任何类型...
}
}
int main()
{
cout << "请输入行列: ";
int nRow, nCol;
cin >> nRow;
cin >> nCol;
string ** p = new_Array_2D< string >( nRow, nCol ); //动态申请连续的二维数组
for( int i = 0; i < nRow; i++ ) //为二维数组赋值
{
for( int j = 0; j < nCol; j++ )
{
char szTemp[30];
sprintf_s( szTemp, "<第%d行,第%d列>", i, j );
p[i][j] = szTemp;
}
}
for( int i = 0; i < nRow; i++ ) //输出二维数组
{
for( int j = 0; j < nCol; j++ )
{
cout << p[i][j] << " ";
}
cout << endl;
}
delete_Array_2D< string >( p, nRow, nCol ); //释放内存
system( "pause" );
return 0;
}
你申请的是一维的 你想要的是二维的 当然报错