指针问题:筛选数组奇数并存入新数组的代码排查求助
问题分析与修复方案
核心错误
这段代码的问题出在前置自增运算符的使用:
odd_numbers[++oddCounter] = array[i];
- 初始
oddCounter为0,遇到第一个奇数时,++oddCounter会先把计数器加到1,再将奇数存入odd_numbers[1],导致odd_numbers[0]位置被闲置(存储未初始化的垃圾值)。 - 当遍历完所有奇数后,
oddCounter的数值是正确的奇数总数,但数组中实际存储的奇数从索引1开始;如果odd_numbers数组的大小等于奇数总数,最后一次赋值会触发数组越界(比如有n个奇数,最后会访问odd_numbers[n],而数组有效索引是0到n-1),引发未定义行为。
修复代码
将前置自增改为后置自增,先使用当前计数器值作为索引,再更新计数:
int CopySelected(const int array[], int size, int odd_numbers[]) { int oddCounter = 0; int i; for (i = 0; i < size; ++i) { if (array[i] % 2 != 0) odd_numbers[oddCounter++] = array[i]; // 后置自增,先赋值再计数 } return oddCounter; }
修复后逻辑说明
- 遍历原数组时,每发现一个奇数,就将其存入
odd_numbers的oddCounter索引位置(从0开始)。 - 完成赋值后,
oddCounter自增1,为下一个奇数预留索引。 - 循环结束后,
oddCounter的数值就是奇数的总数量,返回给调用方后,可直接用这个值读取odd_numbers的前oddCounter个元素,结果完全符合预期。
内容的提问来源于stack exchange,提问作者Sterrock
相关产品推荐
相关产品推荐

