获取"浮点异常(核心转储)"迭代数组元素

时间:2016-05-05 08:02:25

标签: c arrays initialization floating-point-exceptions

我试图获取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;

}

4 个答案:

答案 0 :(得分:2)

问题在于使用的循环条件和隐式启动的数组元素的值。这里要提两件事

<强> 1。多余的数组元素(当初始化列表提供的元素少于数组大小时)初始化为0.

引用C11,章节§6.7.9

  

如果括号括起的列表中的初始值设定项少于元素或成员   用于初始化已知数组的字符串文字中的聚合或更少字符   大小比数组中的元素大,其余的聚合应该是   隐式初始化与具有静态存储持续时间的对象相同。

和..

  

[...]如果没有初始化具有静态或线程存储持续时间的对象   明确地说:   

   - 如果它有算术类型,则初始化为(正或无符号)零;    - 如果是聚合,则根据这些规则初始化(递归)每个成员,   并且任何填充都被初始化为零比特; [...]

<强> 2。 C数组具有从0开始的索引。

所以,在代码中

  for(j=0;j<=MAX;j++)

问题是双重的。

  1. 使用有效条目后,您将面临i%prim[j]中的被零除零情景。这就是FPE的原因。

    要解决此问题,您可以在定义时省略数组大小,然后使用sizeof获取可用作循环条件的数组大小。

  2. 如果您的循环中有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++){