C语言中将数组奇数按序存入另一数组并返回数量的问题排查
问题分析与修正
你的两段代码存在核心逻辑错误,以下是具体问题和修正方案:
关键问题拆解
新数组索引逻辑错误
你直接复用原数组的索引i给odd_numbers赋值,会导致新数组出现大量未初始化的空位。比如原数组是[2,3,4,5],你的代码会把3存在odd_numbers[1]、5存在odd_numbers[3],而odd_numbers[0]和odd_numbers[2]会是随机垃圾值,完全不符合“按顺序存入新数组”的要求。返回值计算错误
C语言中数组作为函数参数会退化为指针,sizeof(array)/sizeof(array[0])计算的是指针大小与int大小的比值,和原数组长度、奇数数量都无关,这部分逻辑完全失效。第二段代码逻辑完全偏离需求
odd_numbers[i] += 1是给新数组对应位置的值加1,根本不是将原数组的奇数存入新数组,完全不符合功能要求。
修正后的代码
int CopySelected(const int array[], int size, int odd_numbers[]) { int count = 0; // 同时追踪新数组的索引和奇数数量 for (int i = 0; i < size; i++) { if (array[i] % 2 != 0) { odd_numbers[count] = array[i]; count++; // 每存入一个奇数,计数器自增 } } return count; // 返回实际存入的奇数数量 }
验证示例
调用示例代码:
#include <stdio.h> int main() { int arr[] = {1,2,3,4,5,6}; int odds[10]; // 需确保新数组大小足够容纳所有奇数 int num_odds = CopySelected(arr, 6, odds); printf("奇数数量:%d\n", num_odds); printf("奇数数组:"); for (int i=0; i<num_odds; i++) { printf("%d ", odds[i]); } return 0; }
输出结果:
奇数数量:3 奇数数组:1 3 5
额外注意事项
- 调用函数时必须保证
odd_numbers的大小足够容纳原数组中所有奇数,否则会触发数组越界的未定义行为。 - 如果需要兼容负数奇数的判断,
(array[i] & 1) != 0比array[i]%2 !=0更严谨(C语言中负数取余结果为负,依然满足!=0,但位运算逻辑更直观)。
内容的提问来源于stack exchange,提问作者Omer Rudnick
相关产品推荐
相关产品推荐

