C语言基于二维数组元素值切换索引的递归函数问题排查
问题解答
需求可行性
该需求可以通过递归实现,核心逻辑是沿arr[i][j]指向的行索引跳转遍历,只要补充合法的边界检测、终止条件和访问标记即可完成校验功能。
现有代码问题清单
- 数组下标越界:C语言数组下标从0开始,你测试的3行3列数组合法行下标范围是
0~2,但main函数中循环调用recursive时传入的i范围是1~3,传入i=3时访问arr[3][j]属于越界访问,读取的是内存中无意义的垃圾值,是你看到current_NEq为乱码的核心原因。 - for循环条件写错:你写的循环是
for(int j=0;i<3;j++),循环判断条件误写为i<3而非j<3,会导致j无限递增,持续访问数组边界外的内存,进一步产生垃圾值和非法访问问题。 - 无递归终止条件与边界检测:递归跳转到
arr[i][j]对应的行索引时,既没有判断该值是否在合法的行下标范围内,也没有标记已访问过的行,很容易出现循环递归(例如arr[1][0]=2、arr[2][0]=1就会来回跳转),最终触发栈溢出。 - 语法不规范:函数声明返回值为
int,但整个函数中没有任何return语句,行为属于未定义,部分编译器会直接报错。 - 校验逻辑缺失:全局变量
t没有参与任何业务逻辑判断,现有代码仅做遍历打印,没有实现你描述的排序校验能力。
最小修复示例(仅解决垃圾值问题)
#include <stdio.h> // 标记已访问的行,避免循环递归 int visited[100] = {0}; void recursive(int i,int n,int m,int arr[n][m]) { // 边界检测:行下标非法 或 已经访问过,直接终止 if(i < 0 || i >= n || visited[i]) return; visited[i] = 1; // 修正循环条件为j<m for(int j=0;j<m;j++) { if(arr[i][j]!=i) { printf("i=%d j=%d , current_NEq=%d \n",i,j,arr[i][j]); // 跳转到对应行递归 recursive(arr[i][j],n,m,arr); } } } int main() { int x[][3]={{1,3,1},{2,1,2},{3,2,2}}; // 修正行下标范围为0~2 for(int i=0;i<3;i++) { // 重置访问标记 for(int k=0;k<3;k++) visited[k] = 0; recursive(i,3,3,x); } printf("Hello, World!\n"); return 0; }
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

