终端显示"分段错误(核心转储)"在C中,请检查我的代码中有什么问题?

时间:2018-01-27 18:14:17

标签: c

代码是关于将三个双变量的地址作为参数 并将最小变量的值移动到第一个变量中间值 到第二个变量,最大值到第三个变量。

#include<stdio.h>
void swapy(double *x, double *y, double *z);

int main()
{
    double no1,no2,no3;

    printf("Enter three numbers\n");
    printf("no1 = ");
    scanf("%lf",&no1);
    printf("no2 = ");
    scanf("%lf",&no2);
    printf("no3 = ");
    scanf("%lf",&no3);
    swapy(&no1,&no2,&no3);
    printf("The numbers will be printed in increasing order!\n");
    printf("no1 = %lf\n",no1);
    printf("no2 = %lf\n",no2);
    printf("no3 = %lf\n",no3);

}

void swapy(double *x, double *y, double *z)
{

     double *max; 
     double *mid; 
     double *min;   

     if(*x>*y && *x>*z) {

        *max = *x;
     }
     else if(*y>*x && *y>*z) {

        *max = *y;
     }
     else {

        *max = *z;
     }



     if(*x<*y && *x<*z) {

        *min = *x;
     }
     else if(*y<*x && *y<*z) {

        *min = *y;
     }
     else {

        *min = *z;
     }

    if(*x != *max && *x != *min) {

        *mid = *x;
     }
     else if(*y != *max && *y != *min) {

        *mid = *y;
     }
     else {

        *mid = *z;
     }

     *x = *min;
     *y = *mid;
     *z = *max;

     return;
}

enter image description here

代码是关于将三个双变量的地址作为参数 并将最小变量的值移动到第一个变量中间值 到第二个变量,第三个变量的最大值。

2 个答案:

答案 0 :(得分:1)

您的问题很明显:maxmidmin未初始化。尝试:

void swapy(double *x, double *y, double *z)
{

     double max; 
     double mid; 
     double min;   

     if( (*x>*y) && (*x>*z)) {

        max = *x;
     }
     else if((*y>*x) && (*y>*z)) {

        max = *y;
     }
     else {

        max = *z;
     }



     if((*x<*y) && (*x<*z)) {

        min = *x;
     }
     else if((*y<*x) && (*y<*z)) {

        min = *y;
     }
     else {

        min = *z;
     }

    if((*x != max) && (*x != min)) {

        mid = *x;
     }
     else if((*y != max) && (*y != min)) {

        mid = *y;
     }
     else {

        mid = *z;
     }

     *x = max;
     *y = min;
     *z = mid;
}

您可以注意到我在if条件中添加了括号。这是一个很好的习惯,否则有时会导致不必要的行为。

答案 1 :(得分:0)

maxminmid是未启动的指针,然后您正在执行导致分段错误的*max = *x;

首先分配maxminmin有效地址,然后再进行操作。

您可以动态分配8个字节,然后存储值。

double *max=malloc(sizeof(double));
 double *mid=malloc(sizeof(double));
 double *min=malloc(sizeof(double));

完整功能

void swapy(double *x, double *y, double *z)
{

        double *max=malloc(sizeof(double)); 
        double *mid=malloc(sizeof(double)); 
        double *min=malloc(sizeof(double));   
        if(*x>*y && *x>*z) {
                *max = *x;
        }
        else if(*y>*x && *y>*z) {
                *max = *y;
        }
        else {
                *max = *z;
        }
        if(*x<*y && *x<*z) {
                *min = *x;
        }
        else if(*y<*x && *y<*z) {
                *min = *y;
        }
        else {
                *min = *z;
        }
        if(*x != *max && *x != *min) {
                *mid = *x;
        }
        else if(*y != *max && *y != *min) {
                *mid = *y;
        }
        else {
                *mid = *z;
        }
        *x = *max;
        *y = *min;
        *z = *mid;

        // return;//wrong .. return type mentioned as void 
}