如何实现C++函数创建二维数组并返回数组与size后传入printArray?
问题解决:C++中创建二维数组并返回数组与尺寸的实现
原需求
编写createArray函数创建二维数组,同时返回该数组与size变量,再将这两个值传入printArray函数完成打印。原代码存在返回方式错误、结构化绑定失败等问题,无法正常运行。
原代码
#include <iostream> using namespace std; int createArray(){ int array[10][10] = {0}; int x, y; int size = 0; while(x != 0 && y !=0){ cin >> x >> y; while( x<0 || x>10 || y<0 || y>10){ cout << "error" << endl; cin >> x >> y; } if(x>0 && y >0){ array[x-1][y-1] = 1; } if(size < x){ size = x; } if (size < y){ size = y; } } return(array, size); } int printArray(int array[10][10],int size){ int i, j; for(i=0; i<size; i++){ for(j=0; j<size; j++){ cout << array[i][j] << " "; } cout << endl; } return 0; } int main() { /* What happens here? I thought I could do something like.. auto [arrayA, sizeA] = createArray(); printArray(arrayA, sizeA); but that's not working */ }
错误分析
- 返回值类型错误:
createArray声明返回int,但试图返回数组和size,且return(array, size)是逗号表达式,实际仅返回size的值,完全不符合需求。 - 局部数组销毁问题:函数内定义的
array[10][10]是局部变量,函数执行结束后会被销毁,即使能返回指针,后续使用也会触发未定义行为。 - 结构化绑定前提不满足:结构化绑定要求返回值为结构体、类、
std::pair/std::tuple等类型,原函数返回int,无法使用该语法。 - 未初始化变量:
x和y未初始化就进入while(x !=0 && y !=0)判断,会触发未定义行为。
修正后的代码
通过结构体封装数组和尺寸,满足返回多个值的需求,同时修复其他逻辑问题:
#include <iostream> using namespace std; // 定义结构体封装数组和尺寸 struct ArrayResult { int arr[10][10]; int size; }; ArrayResult createArray() { ArrayResult result{}; // 初始化所有元素为0 int x, y; result.size = 0; // 先读取一组输入再进入循环,避免未初始化判断 cin >> x >> y; while (x != 0 && y != 0) { // 校验输入范围 while (x < 0 || x > 10 || y < 0 || y > 10) { cout << "error" << endl; cin >> x >> y; } if (x > 0 && y > 0) { result.arr[x-1][y-1] = 1; } // 更新最大尺寸 if (result.size < x) { result.size = x; } if (result.size < y) { result.size = y; } // 读取下一组输入 cin >> x >> y; } return result; } void printArray(int array[10][10], int size) { for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { cout << array[i][j] << " "; } cout << endl; } } int main() { // 使用结构化绑定获取返回值 auto [arrayA, sizeA] = createArray(); printArray(arrayA, sizeA); return 0; }
关键修正点说明
- 结构体封装返回值:定义
ArrayResult结构体包含二维数组和size,使函数能返回多个关联值,满足结构化绑定的要求。 - 初始化局部变量:用
ArrayResult result{}初始化结构体,确保数组元素默认值为0,同时避免未初始化变量的问题。 - 调整循环逻辑:先读取一次输入再进入循环,避免使用未初始化的
x和y进行判断。 - 简化打印函数:打印函数无需返回值,改为
void类型更合理。
内容的提问来源于stack exchange,提问作者user20412196
相关产品推荐
相关产品推荐

