C语言打印generate_maze生成的maze结构体2D数组迷宫及修复未声明错误
编译错误核心原因
你遇到的'maze' undeclared报错是因为:在main函数的作用域内,根本没有定义名为maze的变量。maze本身是你定义的结构体类型名,不是可访问的实例;generate_maze函数内部定义的局部变量maze只在函数作用域内有效,main函数完全无法访问。你在main中接收生成迷宫的实例是名为test的struct maze类型变量,所有成员访问都需要通过test完成。
原有代码的其他连带问题
除了变量名错误,原main函数还有多处逻辑和语法问题,即使修掉undeclared报错也无法正常打印迷宫:
- 数组索引固定写死
maze.a[height][width],没有使用循环的row/col变量做索引,每次循环都在访问同一个固定位置的元素,完全没有遍历数组 - 混淆了「迷宫逻辑单元格尺寸」和「实际打印字符矩阵的尺寸」:你存在
a数组里的是最终要打印的字符矩阵,尺寸远大于用户输入的单元格宽高(需要把墙体、单元格内部填充字符的空间算进去),不能直接用用户输入的单元格数当遍历边界 - 语法错误:C语言区分大小写,没有
If关键字;单个=是赋值操作,不是相等判断;换行转义符是\n不是/n - 冗余的空循环:第一段嵌套循环没有任何实际操作,属于无效代码
修正后的可运行实现
核心调整逻辑:
- 所有结构体成员访问统一通过
test实例完成 - 按照字符矩阵的实际尺寸设置遍历边界
- 逐行逐字符读取
a数组的内容打印,每打完一行直接换行 - 补充内存释放逻辑,避免
malloc申请的内存泄漏
修正后的main函数代码:
int main() { int height; int width; int cellSizer; int randSeed; printf("enter Height "); scanf("%d", &height); printf("enter Width "); scanf("%d", &width); printf("enter Seed "); scanf("%d", &randSeed); printf("enter cellSizer "); scanf("%d", &cellSizer); printf("%d %d %d %d \n", height, width, cellSizer, randSeed); // 接收generate_maze返回的迷宫实例 struct maze test = generate_maze(width, height, cellSizer, randSeed); // 计算字符矩阵的实际行列数: // 行数 = 单元格高度*2 + 1(包含上下外墙、单元格间的水平墙) // 列数 = 单元格宽度*cell_size*2 +1(包含左右外墙、单元格间的垂直墙、单元格内部填充) int matrix_rows = 2 * test.h + 1; int matrix_cols = 2 * test.w * test.cell_size + 1; // 遍历整个字符矩阵打印 for (int row = 0; row < matrix_rows; row++) { for (int col = 0; col < matrix_cols; col++) { printf("%c", test.a[row][col]); } // 打印完一行直接换行 printf("\n"); } // 释放迷宫数组申请的堆内存 for (int row = 0; row < matrix_rows; row++) { free(test.a[row]); } free(test.a); return 0; }
注意:如果你的
maze_dimension_to_matrix函数计算的矩阵尺寸和上述公式有差异,直接用该函数返回的结果设置遍历边界即可,核心原则是遍历的行列数必须和malloc申请的a数组实际大小匹配,避免越界访问。
内容的提问来源于stack exchange,提问作者Krystian Bielak
相关产品推荐
相关产品推荐

