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

指针问题:筛选数组奇数并存入新数组的代码排查求助

问题分析与修复方案

核心错误

这段代码的问题出在前置自增运算符的使用:

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;
}

修复后逻辑说明

  1. 遍历原数组时,每发现一个奇数,就将其存入odd_numbers的oddCounter索引位置(从0开始)。
  2. 完成赋值后,oddCounter自增1,为下一个奇数预留索引。
  3. 循环结束后,oddCounter的数值就是奇数的总数量,返回给调用方后,可直接用这个值读取odd_numbers的前oddCounter个元素,结果完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:13:12