我试图获取10个第一个素数但我在编译时遇到浮点异常(核心转储)错误。
#include <stdio.h>
#define MAX 50
int main(void){
FILE * fp;
int i,j,cnt=0;
int prim[MAX]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
fp = fopen("primeros.dat", "wb");
do{
for (i=2; i<=100; i++){
for(j=0;j<=MAX;j++){
if (i%prim[j]==0){
continue;
}
else{
fwrite(&i, sizeof(int), 1, fp);
cnt++;
}
}
}
}while(cnt<10);
fclose(fp);
return 0;
}
答案 0 :(得分:2)
问题在于使用的循环条件和隐式启动的数组元素的值。这里要提两件事
<强> 1。多余的数组元素(当初始化列表提供的元素少于数组大小时)初始化为0.
引用C11
,章节§6.7.9
如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,其余的聚合应该是 隐式初始化与具有静态存储持续时间的对象相同。
和..
[...]如果没有初始化具有静态或线程存储持续时间的对象 明确地说:
- 如果它有算术类型,则初始化为(正或无符号)零; - 如果是聚合,则根据这些规则初始化(递归)每个成员, 并且任何填充都被初始化为零比特; [...]
<强> 2。 C数组具有从0开始的索引。
所以,在代码中
for(j=0;j<=MAX;j++)
问题是双重的。
使用有效条目后,您将面临i%prim[j]
中的被零除零情景。这就是FPE的原因。
要解决此问题,您可以在定义时省略数组大小,然后使用sizeof
获取可用作循环条件的数组大小。
如果您的循环中有MAX
有效元素,则当j
变为MAX
时,它将超出绑定访问权限。它调用undefined behavior。
您应该将其更改为
for(j=0; j< MAX; j++)
保持极限。
答案 1 :(得分:2)
for(j=0;j<=MAX;j++)
应该是
for(j=0;j<MAX;j++)
您的数组的有效访问权限为prim[0]
到prim[49]
,因此访问prim[50]
是数组超出绑定的访问权限,从而调用未定义的行为
答案 2 :(得分:0)
奇怪的程序要求发现前10个素数,但已经包含了前20个素数的数组。它还会导致除以0错误,因为j
的{{1}}循环限制将导致数组中MAX
值的索引(但是当{{{{}}时,它会超出范围。 1}})。
此解决方案首先要知道只有0
是素数。它构建素数数组,使用每个素数来测试更多数字的素数。
输出文件是二进制格式 - 我会输出到文本文件,但由于这不是主要问题,我在这个例子中只写了控制台的素数。
j == MAX
节目输出:
2
答案 3 :(得分:0)
这里:
for(j=0; j<=MAX; j++){
你最多只能从0到最大1 [0,最大]
改为
for(j=0; j<MAX; j++){