C语言编译报错Array index is past the end of array问题求助
问题原因分析
- 直接报错原因:C语言数组索引从0开始计数,你定义的
groupsToTrace数组长度为LENGTH_OF_A_MACRO也就是3,合法索引范围只有0、1、2,你直接用LENGTH_OF_A_MACRO(值为3)作为索引访问groupsToTrace[3],本身就属于越界操作,因此编译器直接抛出索引越界错误。 - 隐藏越界风险:你当前的trace判断逻辑如果后续调整为位判断(符合你提到的位映射需求),可能同时命中多个判断分支,
number会持续自增,超过2之后访问ToTrace[number]也会触发越界。 - 逻辑适配问题:你当前写的是trace等值判断逻辑,和你说的「位映射判断跟踪分组」的需求不匹配,比如trace等于3(二进制011)的场景下,现有逻辑不会命中任何分支,也无法正常赋值。
修复建议
- 修复数组索引越界问题,不要直接用数组长度作为索引取值。如果你需要把ToTrace中有效的元素批量拷贝到groupsToTrace,参考实现:
// 拷贝前注意限制最大拷贝长度不超过数组容量 int copyCnt = number < LENGTH_OF_A_MACRO ? number : LENGTH_OF_A_MACRO; for(int i=0; i<copyCnt; i++) { blah.groupsToTrace[i] = ToTrace[i]; }
- 调整trace判断逻辑为位判断,匹配位映射需求,同时增加边界判断避免ToTrace越界:
if (trace & 0x1) // 匹配二进制最低位b'001 { if(number < LENGTH_OF_A_MACRO) { ToTrace[number] = noOfGroups / 8; number++; } } if (trace & 0x2) // 匹配中间位b'010 { if(number < LENGTH_OF_A_MACRO) { ToTrace[number] = noOfGroups / 4; number++; } } if (trace & 0x4) // 匹配最高位b'100 { if(number < LENGTH_OF_A_MACRO) { ToTrace[number] = noOfGroups / 2; number++; } }
内容的提问来源于stack exchange,提问作者revanth
相关产品推荐
相关产品推荐

