You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现中序遍历将节点数据存入int数组出现异常问题

问题根本原因

你代码的问题出在index参数的传递方式错误:C语言默认函数参数为值传递,你传入inorder函数的index是值拷贝,每个递归调用栈里的index都是独立的副本,当前调用内执行的index++只会修改当前栈的副本,不会同步更新父调用的index值,更不会同步到main函数里的初始index变量。

你运行输出的下标日志已经能验证这个问题:下标0出现了2次、下标1出现了2次,多个节点会往同一个数组位置写数据,前一个写入的值会被后一个覆盖,最终只有下标0、1、2三个位置被写入了数据,剩下的下标3、4没有被赋值,保留了栈上局部数组未初始化的随机垃圾值,就是你看到的异常负数。

修复方案

推荐使用指针传递的方案,让所有递归调用共用同一个索引变量:

  1. 修改inorder函数的定义,把第三个参数改为int指针类型:
void inorder(Node* N, int* nodeDataList, int* index){
   if(N != NULL){
       inorder(N->left, nodeDataList, index);
       printf("%d: %d ", *index, N->data);
       nodeDataList[(*index)++] = N->data;
       inorder(N->right, nodeDataList, index);
   }
}
  1. 调用inorder时传入index变量的地址即可:
inorder(N, nodeDataList, &index);

如果只是单次调试使用,也可以把index设为函数内的静态变量,不过这种方案不支持多线程场景、也不支持多次调用遍历,通用性不如指针传递方案。

内容的提问来源于stack exchange,提问作者Kevin Lu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:06:02