【问题标题】:C segmentation fault in specific lines特定行中的 C 分段错误
【发布时间】:2018-04-28 04:00:00
【问题描述】:

你好,我是 C 的新手,你可以理解。第 26 - 31 行出现分段错误。 我在代码中提到了错误从哪里开始。 我在this online c compiler 中收到错误消息,并且代码块也没有说明 .exe 文件正在停止。但是这段代码在 DevC++ 中运行良好。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    int terim,s,z;
    int deger[terim][2];
    float alt_limit;
    float ust_limit;
    float toplam;
    float cikarma;

    printf("Denkleminizde kac adet terim var?\n");
    scanf("%d",&terim);

//#################
    for(s=0; s<terim; s++){  //----- segmentation fault begins
        printf("Lutfen %d. terimin katsayisini giriniz : ",s+1);
        scanf("%d",&deger[s][0]);
        printf("Lutfen %d. terimin us degerini giriniz:",s+1);
        scanf("%d",&deger[s][1]);
    }                          //----- segmentation fault ends



    printf("\nLutfen alt limit degerini giriniz\n>>:  ");
    scanf("%f",&alt_limit);
    printf("\nLutfen ust limit degerini giriniz\n>>:  ");
    scanf("%f",&ust_limit);


        cikarma = ust_limit - alt_limit;
        toplam = ust_limit + alt_limit;

    int tercih;

    printf("\n [ 1 ]  Rectangle Yontemi \n");
    printf("\n [ 2 ]  Midpoint Yontemi \n");
    printf("\n [ 3 ]  Trapezoid Yontemi \n");
    printf("\n [ 4 ]  Simpsons Yontemi \n");

    printf("Lutfen tercih ettiginiz yontemin numarasini tuslayiniz\n");
    scanf("%d",&tercih);

    float a_tabaninda , b_tabaninda , tplm_yarisi;
    float rec_sonuc,mid_sonuc;
    float trap_sonuc,simp_sonuc;

    a_tabaninda = pow(alt_limit,deger[z][1]);
    b_tabaninda = pow(ust_limit,deger[z][1]);
    tplm_yarisi = pow((alt_limit + ust_limit)/2,deger[z][1]);
    float zrec,zmid,ztrap,zsimp;
    switch(tercih){
        case 1:

            for(z=0; z<terim ;z++){


                rec_sonuc += ((deger[z][0])*pow(alt_limit,deger[z][1]));

            }

            zrec = (cikarma * rec_sonuc);
            printf("%.4f",fabs(zrec));

            break;

        case 2:

            for(z=0;z<terim;z++){

             mid_sonuc += ((deger[z][0]*pow((alt_limit + ust_limit)/2,deger[z][1])));

            }

            zmid = (cikarma * mid_sonuc);
            printf("%.4f",fabs(zmid));

            break;

        case 3:
            for(z=0;z<terim;z++){

             trap_sonuc += (((deger[z][0]*pow(alt_limit,deger[z][1]))+(deger[z][0]*pow(ust_limit,deger[z][1])))/2);

    }
            ztrap = (cikarma * trap_sonuc);
            printf("%.4f",fabs(ztrap));

            break;

        case 4:
                for(z=0;z<terim;z++){

             simp_sonuc += (deger[z][0]*pow(alt_limit,deger[z][1])) + 4*(deger[z][0]*pow((alt_limit + ust_limit)/2,deger[z][1])) + (deger[z][0]*pow(ust_limit,deger[z][1])) ;

    }
            printf("%.4f",fabs(cikarma/6*simp_sonuc));

            break;

        default:
            printf("Lutfen gecerli bir numara giriniz!\n");

    }


    return 0;
}

感谢您的帮助...

【问题讨论】:

  • 首先,查看 int deger[terim][2];。期限未初始化。我还没有看到其他问题,所以可能还有其他问题。
  • 已初始化。问题还没有解决。

标签: segmentation-fault


【解决方案1】:

我刚刚复制了你的代码并编译了它,并得到了你描述的分段错误。

然后我将 terim 初始化为初始值为 100 并再次编译。如果您在扫描到 term 时我没有输入 100 或更大的值,那么您的程序就会运行而不会出现分段错误。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    int terim = 100,s,z; /* Initialise here */
    int deger[terim][2];

这是我在运行您的程序时得到的输出...

Denkleminizde kac adet terim var?
2 
Lutfen 1. terimin katsayisini giriniz : 1
Lutfen 1. terimin us degerini giriniz:2
Lutfen 2. terimin katsayisini giriniz : 3
Lutfen 2. terimin us degerini giriniz:4

Lutfen alt limit degerini giriniz
>>:  5

Lutfen ust limit degerini giriniz
>>:  6

 [ 1 ]  Rectangle Yontemi 

 [ 2 ]  Midpoint Yontemi 

 [ 3 ]  Trapezoid Yontemi 

 [ 4 ]  Simpsons Yontemi 
Lutfen tercih ettiginiz yontemin numarasini tuslayiniz
1
1900.0000

我不会评论您的代码结构是否良好。我只关注你为什么会遇到分段错误。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我刚刚解决了。我在定义

    int deger[term][2];

    在这一行之后:

    scanf("%d",&terim);

    不知道为什么,但是这段代码在不同的操作系统和不同类型的编译器中表现不同。但是有了这个解决方案,它就可以完美地工作了。

    谢谢大家:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多