堆阵列分配而不是堆栈

问题描述:

我正在实施C++中的eratosthenes算法筛选,并且遇到了问题。当我将我的数组初始化为一个非常大的值(例如100万)时,它会因为我将大数组分配给堆栈而中断。 C中的答案是使用像这样的malloc,像这个Sieve of Eratosthenes,但是这个解决方案在C++中是不行的(据我所知)。关于如何通过在堆而不是堆栈中分配数组来获得此程序的大量数据的任何想法?谢谢。堆阵列分配而不是堆栈

要查看我遇到的问题,请更改下面的代码int integerList [1000],将1000更改为1000000或更高。

int main(void) 
{ 
int userInput = 0; 
int integerList[1000] = {}; 

cout << "Please pick a number to find all prime numbers " 
     << "from 2 to that number: " << endl; 
//for the sake of writing out algorithm only, assume correct input 
cin >> userInput; 

//initialize array 
for (int i = 2; i <= userInput; i++) 
{ 
    integerList[i] = i; 
} 

//implementation of the algorithm 
for (int i = 2; i < userInput; i++) 
{ 
    if (integerList[i] != 0) 
    { 
     for (int j = 2; j < userInput; j++) 
     { 
      integerList[j*integerList[i]] = 0; 
      if (integerList[i] * j > userInput) 
      { 
       break; 
      } 
     } 
    } 
} 
for (int i = 0; i < userInput; i++) 
{ 
    if (integerList[i] != 0) 
    { 
     cout << integerList[i] << " "; 
    } 
} 
system("Pause"); 
return 0; 
} 
+0

相关:你从字面上需要一个* bits *的数组,用于筛选一个erath。该数组不需要包含首先用于访问它的索引的值。如果标志数组'sieve [i]'被设置(非零),则已知素数'i'是如此(主要)。简短版本:您可以使用“N/CHAR_BIT”*字节*在筛选器中找到所有素数为“N”或以下的“N”; (如果在开始之前排除偶数的所有偶数,则*的一半*)。 – WhozCraig

+0

算法和素数标签与此问题完全无关。标题中的Eratosthenes筛网也是无关紧要的。这是我在看完整个问题后发现的。我曾建议编辑,删除不相关的标签,并使标题更具相关性,这被接受,但后来又回滚了(跆拳道?你甚至读过Rollback先生?)我再次尝试建议编辑,该编辑回滚到修订版2被我的回滚拒绝。有人可以真正阅读这个问题吗?如果他们同意,可以回滚到第2版?谢谢。 – RelevantTitlesAreBestTitles

在栈上分配一个大的数组导致stack overflow。其分配在堆上,你可以这样做:

int *integerList = new int[1000000]; 

或者更好,使用std::vector代替。

+0

感谢您的快速回答,它的工作原理非常完美。你能告诉我为什么你说使用矢量会更好。我读过数组更快,但我看到更高级的程序员更多地使用矢量。为了缩小这个话题的范围,我并不是想问一下,向量是否比数组好,或者反过来说,我只是想知道为什么在这种情况下向量会比数组好。 – trueCamelType

+1

@Slimmons在你的例子中,大小由用户输入决定,而不是编译时间常量,这是使用'std :: vector'的主要原因,其大小可以动态增长,而且速度也足够快。 –