C语言动态分配数组空间时元素值约束不生效问题排查
问题成因
- 校验逻辑顺序错误:你当前是先判断
arr[i]的取值,再执行scanf给arr[i]赋值。但malloc申请的动态内存空间不会自动初始化,内存里存储的是无意义的随机垃圾值,提前校验未赋值的arr[i]会大概率触发>=1000的条件,导致程序提前异常退出,无法正常执行输入读取逻辑。 - 额外存在内存泄漏问题:原代码未对
malloc申请的动态内存做释放操作,不符合动态内存使用规范。
修复方法
调整循环内的执行顺序:先执行scanf读取用户输入赋值给arr[i],再校验arr[i]的取值是否符合约束,校验通过后再累加进sum,同时补充内存释放逻辑即可。
修复后的完整代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int n, i, sum = 0; int *arr; scanf("%d", &n); if (n >= 1000 || n <= 1) { return 0; } arr = (int *)malloc(n * (sizeof(int))); for (i = 0; i < n; i++) { scanf("%d", &arr[i]); // 赋值完成后再做值约束校验 if (arr[i] >= 1000) { free(arr); // 退出前释放已申请的内存 return 0; } sum += arr[i]; } printf("%d", sum); free(arr); // 功能执行完成后释放动态内存 return 0; }
内容的提问来源于stack exchange,提问作者ntin suryapally
相关产品推荐
相关产品推荐

