代码错误:分段错误[EVERYTIME]

时间:2016-09-04 04:02:36

标签: c

我正在编写这个C / C ++程序,它可以找到不同大小数组的均值,中位数和模式。虽然,无论输入如何,我都会收到分段错误。我的代码出了什么问题?任何建议总是赞赏! :)

以下是代码:

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

原型:

void sort(double*[],int);
static int min(double,double[],int);
double mean(double[],int);
double median(double[],int);
double mode(double[],int);
int numberOf(double,double[],int);

主要功能:

int main() {
    int i;
    scanf(" %d ",&i); //10
    double arr[i]; //array that contains all the values and will be sortted
    for (int j=0; j<i; j++) { //64630 11735 14216 99233 14470 4978 73429 38120 51135 67060
        scanf(" %lf ",&arr[j]);
    }
    printf("%.1lf\n%.1lf\n%.0lf",mean(arr,i),median(arr,i),mode(arr,i));
    return 0;
}

排序功能:
    最终结果应该从中位函数中的调用更新数组arr。将原始数组中使用的值更改为-1,直到整个数组为止。

void sort(double* arr[],int l) {
    double arr2[l];
    for (int i=0; i<l; i++) {
        int j;
        if (i)
            j = min(arr2[i-1], *arr, l);
        else
            j = min(0, *arr, l);
        arr2[i] = *arr[j];
        *arr[j] = -1;
    }
    for (int i=0; i<l; i++) {
        *arr[i] = arr2[i];
    }
}

最小函数(排序函数的辅助函数):
    在数组元素中查找大于或等于 minLookingTo 的最小值
    返回值所在的位置。

static int min(double minLookingTo,double arr[],int l) {
    int minP;
    double minA = minLookingTo;
    for (int i=0; i<l; i++) {
        if (arr[i] == -1)
            continue;
        if (minLookingTo<=arr[i] && arr[i]<=minA) {
            minP = i;
            minA = arr[i];
        }
    }
    return minP;
}

平均功能:
    返回长度为 l

的输入数组的平均值
double mean(double arr[],int l){
    double total = 0;
    for (int i=0; i<l; i++) {
        total += arr[i];
    }
    return total/l;
}

中位数功能:
    使用排序功能。假设有效,则返回中位数。

double median(double arr[],int l){
    sort(&arr,l);
    double d = arr[(l/2)+1];
    double dd = arr[(l/2)];
    if (l%2!=0)
        return d;
    return (d+dd)/2;
}

模式功能:
    使用NumberOf函数确定具有最大重复次数的数组元素。返回最高(相等)重复的最低值。

double mode(double arr[],int l){
    int maxA;
    int maxP;
    for (int i=0;i<l;i++) {
        int j = numberOf(arr[i],arr,l);
        if (j>maxA) {
            maxA = j;
            maxP = i;
        }
        else if (j==maxA && arr[maxP]>arr[i])
            maxP = i;
    }
    double d = arr[maxP];
    return d;
}

NumberOf功能:
    模式功能的辅助功能。返回值的元素数量。

int numberOf(double looking,double arr[],int l) {
    int amount = 0;
    for (int i=0; i<l; i++)
        if (looking == arr[i])
            amount++;
    return amount;
}

2 个答案:

答案 0 :(得分:1)

您的代码有一系列错误。其中一些:

  1. 您不需要(在这种情况下)在scanf中使用空格。这导致读数错误。
  2. 您无需将数组地址传递给函数即可更改其值。数组总是通过引用传递。因此,将您的功能从void sort(double*[],int);更改为void sort(double[],int);,在功能中进行必要的更正,并使用sort(arr,l);而不是sort(&arr,l);
  3. 进行调用
  4. 你的min()函数声明了一个未初始化的变量minP,所以这个变量包含你内存中的垃圾。 for()循环没有输入任何if()条件,因此你的函数结束并返回仍然未初始化的变量minP。然后使用此随机值访问数组中的索引:j = min(0, arr, l); min返回一个随机数,然后arr2[i] = arr[j];访问禁止的内存区域,这会导致您的分段错误错误。 maxP函数中的变量maxAmode()也出现了同样的问题。
  5. 访问数组时必须始终小心,不要超出其范围,并始终确保在使用变量时将初始化变量。正如其他人所评论的那样,我也强烈建议您学习如何调试程序,因为这将帮助您分析其执行并跟踪错误。

答案 1 :(得分:1)

我将您的细分错误跟踪到sort()调用的median()例程。我没有修复sort(),而是从库中替换qsort()来说服自己这就是问题所在:

// Median Function:
// Uses the Sort Function. Assuming that works, returns the median.

int comparator(const void *p, const void *q) {

    double a = *((double *) p);
    double b = *((double *) q);

    return (a > b) - (a < b); // compare idiom
}

double median(double array[], int length) { 
    // sort(array, length);

    qsort(array, length, sizeof(double), &comparator);

    double d = array[length / 2];

    if (length % 2 != 0) {
        return d;
    }

    double dd = array[(length / 2) - 1];

    return (d + dd) / 2;
}

对于提供的数字示例列表,在更正其余代码后,返回中位数为44627.5

其他修正:

你错过了最后的换行符:

printf("%.1lf\n%.1lf\n%.0lf",mean(arr,i),median(arr,i),mode(arr,i));

您应该初始化mode()中的变量:

double mode(double array[], int length) {
    int maxA = INT_MIN;
    int maxP = -1;

    for (int i = 0; i < length; i++) {
        int j = numberOf(array[i], array, length);

        if (j > maxA) {
            maxA = j;
            maxP = i;
        } else if (j == maxA && array[maxP] > array[i]) {
            maxP = i;
        }
    }

    return array[maxP];
}