作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,当程序尝试访问程序堆栈外的内存或者没有更多内存可分配给程序时,就会发生段错误或超出内存限制错误。
编辑:当我写这个问题时,我不知道编程语言中的调试器。但现在我知道,这个程序运行并且所有数组内存都是在程序启动时分配的。
所以我的问题:
为什么这段 C 代码会出现段错误?这段代码是埃拉托斯特尼筛法的实现。
#include <stdio.h>
#define LIMIT 10000000
#define PRIMES 700000
int is_prime[LIMIT];
int prime[PRIMES];
main()
{
int i, j;
for (i = 0; i < LIMIT; i++)
is_prime[i] = 1;
is_prime[0] = is_prime[1] = 0;
for (i = 0; i < LIMIT; i++)
if (is_prime[i])
for (j = i*i; j < LIMIT; j += i)
is_prime[j] = 0;
j = 0;
for (i = 0; i < LIMIT && j < PRIMES; i++)
if (is_prime[i])
prime[j++] = i;
return 0;
}
最佳答案
for (j = i*i; j < LIMIT; j += i)
其中的 i*i
可能会溢出,导致出现较大的负数。这使得后续的 is_prime[j] 访问数组的方式越界。应该是:
for (j = i+i; j < LIMIT; j += i)
关于c - 超出了神秘的内存限制;埃拉托色尼算法筛分错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16032938/
我是一名优秀的程序员,十分优秀!