将该值传递给函数时值是否会发生变化?

时间:2013-03-03 00:49:39

标签: c++ math

当我调试这个程序时,我发现max是一个垃圾数而不是我传给它的值。

#include <iostream>
#include <cmath>

float findPrimes(int max) {

    float* primes = new float[max];

    bool* boolarray = new bool[max];
    for(int i=0; i<=max; i++) {
        boolarray[i] = true;
    }

    int x = 1;

    for(int i=2; i<=sqrt(max); i++) {
        if(boolarray[i]) {
            for(int j=pow(i, 2)+x*i; j<=max; x++)
            {
                boolarray[j] = false;
            }
        }
    }

    int n = 0;

    while(n<=max) {
        if(boolarray[n]) 
            primes[n] = boolarray[n];
        n++;
    }

    return primes[max];

}

int main() {

    float answer = findPrimes(6);

    printf("%f\n", answer);

    _sleep(10000);

    return 0;
}

它告诉我,当我调试它时,max是一个垃圾号码,所以这就是程序不执行的原因(它运行,但没有任何反应)。我很确定我正在做所有的数学运算(使用Eratosthenes的Sieve),那么是什么给出了?


编辑:

#include <iostream>
#include <cmath>

float findPrimes(int max) {

    std::cout << max << "\n";

    float* primes = new float[max-1];

    bool* boolarray = new bool[max-1];
    for(int i=0; i<=max-1; i++) {
        boolarray[i] = true;
    }

    int x = 1;

    for(int i=2; i<=sqrt(max); i++) {
        if(boolarray[i]) {
            for(int j=pow(i, 2)+x*i; j<=max-1; x++)
            {
                boolarray[j] = false;
            }
        }
    }

    int n = 0;

    while(n<=max-1) {
        if(boolarray[n]) 
            primes[n] = boolarray[n];
        n++;
    }

    return primes[max-2];

}

int main() {

    printf("%f\n", findPrimes(6));

    _sleep(10000);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您访问范围超出范围。

bool* boolarray = new bool[max-1];
for(int i=0; i<=max-1; i++) {
    boolarray[i] = true;
}

假设max为5.第一行分配4个bool,编号为0到3.循环从0到4循环。但是没有条目4.只有4个条目,0,1,2和3

你应该这样做:

bool* boolarray = new bool[max];
for(int i=0; i<max; i++) {
    boolarray[i] = true;
}

现在,如果max为5,则分配5个bool,编号为0到4.你的循环现在从0变为4,这就是你想要的。