C++ 关于二维数组改变长度的问题,求助!

l20010721 2020-07-13 03:09:58
题目:编写一个模板函数change2darray,它改变一个二维数组的大小。它将二维数组的行数从old_row变成new_row,列数从old_column变成new_column。函数首相分配一个新的、行数为new_row,列数为new_column的数组,然后把原数组前min{old_row, new_row}行,前min{old_column,new_column}列的元素复制到新数组中,最后释放原数组所占用的空间。


我的思路:
创建五个函数,分别用来求最小值,创建数组,改变数组大小,打印数组,释放数组。在main()函数中调用测试,先创建了一个三行两列的数组,并打印。成功了,结果如下图。

但当我调用change2darray函数后,会异常退出:

我觉得应该是change2darray函数出了问题,但我不明白是哪里有错误,希望大家帮忙,谢谢!
代码如下,用的vs2019:
#include<iostream>
using namespace std;

//得到最小值
int getmin(int a, int b) {
return a > b ? b : a;
}

//创建二维数组,并赋值(为了简单,赋值为int类型)
template<class t>
t** create2darray(int row, int column) {
int** x = new t* [row];
for (int i = 0; i < row; i++)
x[i] = new t[column];
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++)
x[i][j] = 10 * (i + 1) + j + 1;
}
return x;
}

//释放二维数组
template<class t>
void delete2darray(t** x, int row) {
for (int i = 0; i < row; i++)
delete[]x[i];
delete[]x;
}


template<class t>
t** change2darray(t**& x, int old_row, int old_column, int new_row, int new_column) {
int num1 = getmin(old_row, new_row);//最多复制num1行
int num2 = getmin(old_column, new_column);//最多复制num2列
t** temp = 0;
for (int i = 0; i < num1; i++)
copy(x[i], x[i] + num2, temp[i]);
delete2darray(x, old_row);
return temp;
}

//打印二维数组
template<class t>
void print2darray(t** x, int row, int column) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++)
cout << x[i][j] << '\t';
cout << endl;
}
cout << endl;
}


int main() {
int old_row = 3;
int old_column = 2;
int new_row = 4;
int new_column = 3;
int** p = create2darray<int>(old_row, old_column);//创建一个三行二列的二维数组,p指向该二维数组
print2darray(p, old_row, old_column);//打印
int** q = change2darray(p, old_row, old_column, new_row, new_column);//改变数组大小,为四行三列,令q指向新数组
//print2darray(q, new_row, new_column);//打印新数组
//delete2darray(p, new_row);//把p释放
}
...全文
222 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
l20010721 2020-07-15
  • 打赏
  • 举报
回复
非常感谢你的回答!我之前确实不太会用断点调试,今后会学着使用的!
晚晶 2020-07-13
  • 打赏
  • 举报
回复
main函数里的最后的注释更正为//把q释放
晚晶 2020-07-13
  • 打赏
  • 举报
回复
change2darray函数那里我写了四个注释,main函数我写了两个注释,注释用来说明更改原因,具体代码如下

#include<iostream>
using namespace std;

//得到最小值
int getmin(int a, int b) {
	return a > b ? b : a;
}

//创建二维数组,并赋值(为了简单,赋值为int类型)
template<class t>
t** create2darray(int row, int column) {
	int** x = new t*[row];
	for (int i = 0; i < row; i++)
		x[i] = new t[column];
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++)
			x[i][j] = 10 * (i + 1) + j + 1;
	}
	return x;
}

//释放二维数组
template<class t>
void delete2darray(t** x, int row) {
	for (int i = 0; i < row; i++)
		delete[]x[i];
	delete[]x;
}


template<class t>
t** change2darray(t**& x, int old_row, int old_column, int new_row, int new_column) {
	int num1 = getmin(old_row, new_row);//最多复制num1行
	int num2 = getmin(old_column, new_column);//最多复制num2列
	//t** temp = 0;这是一个空指针,直接使用它的话,copy函数会报错
	t** temp = create2darray<int>(new_row, new_column);//于是这里新建一个新的二维数组
	for (int i = 0; i < num1; i++)//把旧的数据拷贝过去
		copy(x[i], x[i] + num2, temp[i]);
	delete2darray(x, old_row);//当你删除了旧的二维数组后,mian函数中的p就相当于失效了
	return temp;
}

//打印二维数组
template<class t>
void print2darray(t** x, int row, int column) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++)
			cout << x[i][j] << '\t';
		cout << endl;
	}
	cout << endl;
}


int main() {
	int old_row = 3;
	int old_column = 2;
	int new_row = 4;
	int new_column = 3;
	int** p = create2darray<int>(old_row, old_column);//创建一个三行二列的二维数组,p指向该二维数组
	print2darray(p, old_row, old_column);//打印
	int** q = change2darray(p, old_row, old_column, new_row, new_column);//改变数组大小,为四行三列,令q指向新数组
	print2darray(q, new_row, new_column);//打印新数组
 	//↑查看结果
	//delete2darray(p, new_row);//把p释放
	//↑由于p已经失效(见change2darray内的我的注释),所以在这里该被释放的不是p,而是q
	delete2darray(q, new_row);//把p释放
}
结果如图:
生活几何_ 2020-07-13
  • 打赏
  • 举报
回复
调试初步发现在37行会崩,细节你再看看吧
生活几何_ 2020-07-13
  • 打赏
  • 举报
回复
断点,单步调试是个好东西

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧