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

数组生成指定范围随机数出现异常值的原因及解决方法

问题原因分析与修正方案

问题产生的核心原因

  • 未初始化变量导致数组大小非法:你定义了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:07:35