数组生成指定范围随机数出现异常值的原因及解决方法
问题原因分析与修正方案
问题产生的核心原因
- 未初始化变量导致数组大小非法:你定义了
int tS;但未赋值,直接用它声明变长数组int testScores[tS];。此时tS是内存中的随机垃圾值,数组实际大小完全不可控。后续循环中tS从0递增到199,必然超出数组实际大小,触发数组越界访问——这会覆盖内存中其他区域的数据,最终输出异常数值(如32456或-21578)。 - 变量混用加剧逻辑混乱:用同一个
tS既充当数组大小变量,又作为循环计数器,导致数组大小和循环边界完全不匹配,进一步放大了越界风险。
修正方法
方案1:使用固定大小数组(新手首选简单方案)
直接声明足够容纳200个元素的数组,避免变长数组的不确定性:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(0)); const int MAX_SCORES = 200; int testScores[MAX_SCORES]; // 单独声明循环变量,避免和数组大小变量混用 for(int tS = 0; tS < MAX_SCORES; ++tS) { testScores[tS] = rand() % (99 - 55 + 1) + 55; printf("%i\n", testScores[tS]); } return 0; }
修正点说明:
- 用常量提前定义数组大小,确保能容纳所有生成的随机数
- 循环变量单独声明,逻辑更清晰,避免变量复用引发的错误
- 补充了必要的头文件(原代码缺失
<stdio.h>、<stdlib.h>、<time.h>,规范写法必须包含)
方案2:动态分配内存(适合灵活调整数组大小的场景)
如果后续需要动态调整数组长度,可以用malloc分配内存:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(0)); const int MAX_SCORES = 200; // 动态分配内存,检查分配是否成功 int *testScores = malloc(MAX_SCORES * sizeof(int)); if(testScores == NULL) { printf("内存分配失败\n"); return 1; } for(int tS = 0; tS < MAX_SCORES; ++tS) { testScores[tS] = rand() % (99 - 55 + 1) + 55; printf("%i\n", testScores[tS]); } free(testScores); // 释放动态分配的内存,避免内存泄漏 return 0; }
修正点说明:
- 用
malloc动态分配内存,大小明确可控 - 必须检查
malloc返回值,避免内存分配失败导致崩溃 - 使用完内存后用
free释放,防止内存泄漏
内容的提问来源于stack exchange,提问作者jtward17
相关产品推荐
相关产品推荐

