Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Memory Management - Fatal编程技术网

C++数组大小和如何管理大型数组?

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] =

我试着用筛子法找出从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] == '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::向量?我可以自己解决问题,谢谢!下次我可以自己解决这个问题,谢谢!