C++ 效率和阵列崩溃
每当我运行此代码并输入超过500000的数字时,程序就会崩溃。还有一种方法可以使这个过程更加简单/高效,而无需使用:向量、乘法、除法和%。非常感谢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
#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;i cout说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