Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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 在堆栈和堆上分配内存的Eratosthenes筛选的内存错误_C_Memory Management_Sieve Of Eratosthenes - Fatal编程技术网

C 在堆栈和堆上分配内存的Eratosthenes筛选的内存错误

C 在堆栈和堆上分配内存的Eratosthenes筛选的内存错误,c,memory-management,sieve-of-eratosthenes,C,Memory Management,Sieve Of Eratosthenes,我已经实现了下面版本的Eratosthenes筛,它在堆上分配内存来存储表示素数的数组 void筛(int*素数,int n){ 对于(int i=0;i

我已经实现了下面版本的Eratosthenes筛,它在堆上分配内存来存储表示素数的数组

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) {