C 在堆栈和堆上分配内存的Eratosthenes筛选的内存错误
我已经实现了下面版本的Eratosthenes筛,它在堆上分配内存来存储表示素数的数组C 在堆栈和堆上分配内存的Eratosthenes筛选的内存错误,c,memory-management,sieve-of-eratosthenes,C,Memory Management,Sieve Of Eratosthenes,我已经实现了下面版本的Eratosthenes筛,它在堆上分配内存来存储表示素数的数组 void筛(int*素数,int n){ 对于(int i=0;i
void筛(int*素数,int n){
对于(int i=0;i 对于(int p=2;p由于您为n-1
元素分配内存,因此我建议将sieve()
中最内层的循环从
for (int i = 2*p - 2; i < n; i += p) {
for(inti=2*p-2;i
到
for(inti=2*p-2;i
以便使索引限制与分配的大小匹配
使用n=10000000
很可能会出现堆栈溢出
您可以使用getrlimit()
/setrlimit()
获取/设置堆栈大小。从最大堆栈大小计算数组大小的限制可能很困难,因为您必须找出除了大数组之外还需要多少堆栈
另请参见在这两种变体中,您正在为n-1整数分配空间,同时循环到并包括n。请尝试为n+1分配空间instead@hager为n+1整数分配空间解决了第一个错误,即调用print\u筛(15)时出现的错误
用于基于堆的实现,但第二个错误仍然存在。为n
int分配空间也足以解决第一个问题。我想知道为什么为n-1
int分配空间是不够的,因为我在传递参数n
时检查了闭合区间中的所有整数[2,n]
,其中只有n-1
。这取决于您运行的平台,在我的linux桌面上,默认最大堆栈大小为8192 kB。您似乎有相同的限制,因为2090000*sizeof(int)
只是勉强放在堆栈上。这不是问题的原因,但在这里,我建议您阅读并理解。首选int*primes=malloc(sizeof*primes*(n+1));
for (int i = 2*p - 2; i < n; i += p) {
for (int i = 2*p - 2; i < n - 1; i += p) {