Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 效率和阵列崩溃_C++_Arrays - Fatal编程技术网

C++ 效率和阵列崩溃

C++ 效率和阵列崩溃,c++,arrays,C++,Arrays,每当我运行此代码并输入超过500000的数字时,程序就会崩溃。还有一种方法可以使这个过程更加简单/高效,而无需使用:向量、乘法、除法和%。非常感谢 #include <iostream> using namespace std; int get_primes(int array[], int num); void sieve(int array[], int num); void goldbach(int primes[], int nprimes, int num); void

每当我运行此代码并输入超过500000的数字时,程序就会崩溃。还有一种方法可以使这个过程更加简单/高效,而无需使用:向量、乘法、除法和%。非常感谢

#include <iostream>
using namespace std;

int get_primes(int array[], int num);
void sieve(int array[], int num);
void goldbach(int primes[], int nprimes, int num);
void show(int array[], int num);

int main()
{
int num;
cout << "Enter a number to calculate up to." << endl;
cin>>num;
if ( num < 2 )
    return 0;

int array[num];
array[0]= array[1]= 0;
for ( int i= 2; i < num; ++i )
    array[i]= i;

int nprimes = get_primes(array, num);

show(array, nprimes);

goldbach(array, nprimes, num);

return 0;
}

void show(int array[], int num)
{
for (int i=0; i<num; i++)
    if (array[i] > 0)
        cout << array[i] << " "<< endl;
cout << endl;
}

int get_primes(int array[], int num)
{

sieve(array, num);


int pos = 0;
for (int i = 2; i < num; ++i)
    if (array[i] > 0)
        array[pos++] = array[i];

return pos;
}

void sieve( int array[], int num )
{
for ( int i= 0; i < num; ++i )
{
    if ( array[i] > 0 )
    {
        for ( int j = i+i; j < num; j += i )
        {
            array[j] = 0;
        }
        }
    }
}


void goldbach(int primes[], int nprimes, int num)
{

int a;
for (int a = 4; a<=num; a+=2)
{
    bool found = false;
    int i, j;


    for (i = 0; !found && i < nprimes && primes[i];  ++i)
        for (j = 0; !found && j < nprimes && primes[i]; ++j)

            {
                found = a == (primes[i] + primes[j]);

                if (found)
         cout << a << '\t' << primes[i] << " + " << primes[j] <<endl;
            }

    if (!found)
        cout << a << "\tnot found" << endl;
    }
}
#包括
使用名称空间std;
int get_素数(int数组[],int num);
空隙筛(int数组[],int num);
void goldbach(int primes[],int nprimes,int num);
void show(int数组[],int num);
int main()
{
int-num;
库特数;
if(num<2)
返回0;
int数组[num];
数组[0]=数组[1]=0;
对于(int i=2;icout说
int数组[num]
是说“从堆栈中分配
num*sizeof(int)
字节。”

因此,可能是堆栈的大小只有1兆字节,当您要求更多时,就会遇到下溢情况。

更改

int array[num];

并将所有函数参数从使用

int array[] 

您仍然可以像array[i]一样正常地访问指针


<>我建议你在C++中查找堆栈和堆内存来理解为什么它会工作,也可以读取指针。

它到底在哪里崩溃?你能包括一个堆栈跟踪或行号吗?你昨天问了这个完全相同的问题吗?我不能使用向量,因为我的教授还没有教过它,他会指责我。cheating@Bawad Himmelarschundzwirnnochamalzefix!我已经解释了除了
std::vector
之外还可以使用哪些替代方法。你是在装死吗?@Bawad如果你的教授认为使用
vector
是作弊,那么这个呢?:
int-array[num]因为标准C++没有这样的数组,其中条目的数目是变量。这也叫做VLA,并不是标准C++特性。考虑到他是初学者,你不应该解释如何删除内存吗?@尼尔科克是的,没错,但我不想让他迷惑。很多情况下,如果他做了这些更改,代码至少会运行,然后删除apon退出。如果代码稍微复杂一点,并且在main以外的函数中进行了堆分配,并且多次调用了main,那么这将开始导致内存泄漏,但是带有数组alocate的main函数只运行一次,我知道它的错误做法是b但我只是想让他的代码先运行,然后让他稍后阅读heap vs stack。
int array[] 
int* array