C++数组大小和如何管理大型数组?
我试着用筛子法找出从1到100000的素数。 这是我的密码:C++数组大小和如何管理大型数组?,c++,arrays,memory-management,C++,Arrays,Memory Management,我试着用筛子法找出从1到100000的素数。 这是我的密码: #include <iostream> #include <cstring> using namespace std; int main() { char *a = new char[100000]; memset(a, '1', 100000*sizeof(char)); for(int i=2; i<100000; i++) { if(a[i] =
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char *a = new char[100000];
memset(a, '1', 100000*sizeof(char));
for(int i=2; i<100000; i++)
{
if(a[i] == '1')
{
for(int j=i*i; j<100000; j += i)
{
a[j] = '0';
}
}
}
int count = 0;
for(int i=2; i<100000; i++)
{
if(a[i] == '1')
count++;
}
cout << count << endl;
delete [] a;
return 0;
}
这段代码编译时没有错误,但是当我运行它时,程序崩溃了
我将数组大小从100000改为40000,结果是4203,所以有4203个素数,从1到40000
我知道在我的32位操作系统中,数组的最大字节是0x7fffffff字节
100000个字符或40000个字符远小于0x7fffffff字节
为什么当数组大小为100000时,程序会运行?当数组大小为40000时,程序会运行?我的代码有问题吗 问题在于这一行:
for(int j=i*i; j<100000; j += i)
SEGFULT问题在于这条线路:
for(int j=i*i; j<100000; j += i)
segfault您有一个整数溢出问题 指定j=i*i。当i等于99999时,i*i是999800001,很可能高于您平台上的INT_MAX。在32位平台上,INT_MAX为2147483647,低于999980000001 此处将它们分为两行进行比较:
2147483647
9999800001
由于整数溢出,您的程序有未定义的行为。您有整数溢出问题 指定j=i*i。当i等于99999时,i*i是999800001,很可能高于您平台上的INT_MAX。在32位平台上,INT_MAX为2147483647,低于999980000001 此处将它们分为两行进行比较:
2147483647
9999800001
由于整数溢出,您的程序具有未定义的行为。为什么需要使用数组?你可以考虑使用一个更简单的算法,例如:
#include <iostream>
using namespace std;
int main()
{
int N;
int count = 0;
cin >> N;
for (int i = 2; N > 0; ++i)
{
bool isPrime = true;
for (int j = 2; j < i; ++j)
{
if (i % j == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
if (i > N)
break;
count++;
cout << i << "\n";
}
}
cout << "The number of primes from 0 to " << N << " is " << count << endl;
char stop;
cin >> stop;
return 0;
}
此算法输出9592作为从0到100000的素数。为什么需要使用数组?你可以考虑使用一个更简单的算法,例如:
#include <iostream>
using namespace std;
int main()
{
int N;
int count = 0;
cin >> N;
for (int i = 2; N > 0; ++i)
{
bool isPrime = true;
for (int j = 2; j < i; ++j)
{
if (i % j == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
if (i > N)
break;
count++;
cout << i << "\n";
}
}
cout << "The number of primes from 0 to " << N << " is " << count << endl;
char stop;
cin >> stop;
return 0;
}
此算法输出9592作为从0到100000的素数。关于溢出的所有其他答案都是正确的 回答一个潜在的后续问题:首先,我如何避免/发现这种情况?有些编译器可以为未定义的行为提供运行时检测 以下是我使用UBSan运行您的代码时得到的结果: 作为参考,第14行是:
for(int j=i*i; j<100000; j += i)
关于溢出的所有其他答案都是正确的 回答一个潜在的后续问题:首先,我如何避免/发现这种情况?有些编译器可以为未定义的行为提供运行时检测 以下是我使用UBSan运行您的代码时得到的结果: 作为参考,第14行是:
for(int j=i*i; j<100000; j += i)
既然这是C++,为什么不STD::向量?既然是C++,为什么不STD::向量?我可以自己解决问题,谢谢!下次我可以自己解决这个问题,谢谢!