代码之家  ›  专栏  ›  技术社区  ›  Roger Costello

填充数组参数时堆栈溢出(0xc0000fd),但填充静态数组时不溢出

c
  •  2
  • Roger Costello  · 技术社区  · 4 年前

    免责声明:我是一个C新手。

    mean 和标准差 stddev r . 要生成的随机数的数目由常量指定 NUMRANDOMS .

    我写了一个函数 getRandom 意思是 标准偏差 r .

    我写了两个版本 . 第一个版本创建 r 作为静态数组,并返回指向 r :

    double * getRandom(double mean, double stddev) {
        static double r[NUMRANDOMS];
    
        for (int i = 0; i < NUMRANDOMS; i++) {
            r[i] = normal(mean, stddev);
        }
        return r;
    }
    

    不管我设定的有多大,这个版本都很完美 数量 . 我已经涨到了1亿,而且效果很好。

    随机获取 ,我把数组传给它 r 数量 ):

    void getRandom(double r[], int len, double mean, double stddev) 
    
        for (int i = 0; i < len; i++) {
            r[i] = normal(mean, stddev);
        }
        return;
    }
    

    数量 值为1000、10000或100000,但当我将其设置为一百万时,会出现运行时错误 0xC00000fd . 从其他帖子中,我了解到这个错误消息意味着“堆栈溢出”。

    为什么第二个版本在达到一百万之前还能正常工作?为什么第一个版本即使有1亿美元也能正常工作?

    1 回复  |  直到 4 年前
        1
  •  4
  •   Acorn    4 年前

    很可能,你正在分配 r 在调用方的堆栈中,如下所示:

    double r[NUMRANDOMS];
    getRandom(r, NUMRANDOMS, ...);
    

    在第一个版本中,你把它作为 static :

    static double r[NUMRANDOMS];
    

    在后一个版本中,内存由操作系统在加载程序时保留。