C语言 动态数组分配,指针,最小值,最大值,平均值,总和

4smxwvx5  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(112)

我一直在尝试运行这段代码,并不断得到分段错误,但数组打印。我到底做错了什么?我相信问题主要是在某处与格式的函数或与参数,我把函数,我已经尝试了这么多的方式,但没有我尝试过似乎工作。

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

void fillArray(int arr[], int arr_size);
void printArray(int arr[], int arr_size);
void fMin(int arr[], int arr_size, int *q);
void fMax(int arr[], int arr_size, int *p);
void fSum(int arr[], int arr_size, int *x);

int main(int argc, char *argv[])
{
    int *arr=NULL;
    int arr_size = atoi(argv[1]);
    arr = malloc(arr_size * sizeof(int));

    if(argc <= 2)
    {
        printf("ERROR: invalid command line args");
        printf("Expecting: EXCECUTABLE <SIZE>");
    }

    fillArray(arr, arr_size);

    int i;
    for(i=0; i<arr_size; i++)
    {
        printf("argv[%d] - %2d", arr_size, arr[i]);
        printf("\n");
    }

    printArray(arr, arr_size);

    int *min, *max ,avg, sum;
    int *p;
    int *q;
    int *x;
    avg = sum / arr_size;

    fMax(arr, arr_size, p);
    fMin(arr, arr_size, q);
    fSum(arr, arr_size, &sum);

    printf("Max: %3d Pos: %3d \n", *max, *p);
    printf("Min: %3d Pos: %3d \n", *min, *q);
    printf("Sum: %3d \n", *x);
    printf("Avg: %3d \n", avg);

    //for realloc! printArray(arr, arr_size);

    free(arr);
    return 0;
}

void fillArray(int arr[], int arr_size)
{
     srand(time(NULL));
    int i;
    for(i=0; i<arr_size; i++)
    {
        arr[i] = rand() % 101;
    }
}//good!

void printArray(int arr[], int arr_size)
{
    int i = 0;
    printf(" POS | VAL \n");
    printf("-----------\n");
    for(i=0; i<arr_size; i++)
    {
         printf(" %3d | %3d \n", i, arr[i]);
     }
}//good!

void fMin(int arr[], int arr_size, int *q)
{
    int i;
    int *min=NULL;
    min=&arr[i];
    for(i=1; i<arr_size; i++)
    {
        if(arr[i] < *min)
        {
            min = &arr[i];
            q = &i;
        } 
    }
}//cant null pointer

void fMax(int arr[], int arr_size, int *p)
{
    int i;
    int *max=NULL;
    max = &arr[i];
        for(i=1; i<arr_size; i++)
        {
            if(arr[i] > *max)
            {
                max = &arr[i];
                p = &i;
            } 
        }
}//good?
void fSum(int arr[], int arr_size, int *x)
{
    int i;
    int sum = *x;
    for (i=0; i<arr_size; i++)
    {
        *x = i + arr[i];
    }
}//what  the  heckie goin on here

我运行”./a.输出5 6”
并且它输出:

argv[5] - 31
argv[5] - 13
argv[5] - 27
argv[5] - 83
argv[5] - 23
 POS | VAL 
-----------
   0 |  31 
   1 |  13 
   2 |  27 
   3 |  83 
   4 |  23 
zsh: segmentation fault  ./a.out 5 6
qyyhg6bp

qyyhg6bp1#

你的大部分问题都在于以下几行:

int *min, *max, avg, sum;
int *p;
int *q;
int *x;
avg = sum / arr_size;

fMax(arr, arr_size, p);
fMin(arr, arr_size, q);
fSum(arr, arr_size, &sum);

将未初始化的指针pq传递给fMax()fMin();这是一个崩溃的秘诀,在计算和之前先计算平均值(因此sum未初始化)。
您需要的代码更像:

int min, max, avg, sum;

fMax(arr, arr_size, &max);
fMin(arr, arr_size, &min);
fSum(arr, arr_size, &sum);
avg = sum / arr_size;

我没有检查函数,但调用肯定是假的。

  • 时间流逝 *

函数中也有问题,例如,在fMin()中,并不完全清楚是传递回最小值的索引还是实际的最小值,但问题很多。
您已经:

void fMin(int arr[], int arr_size, int *q)
{
    int i;
    int *min=NULL;
    min=&arr[i];
    for(i=1; i<arr_size; i++)
    {
        if(arr[i] < *min)
        {
            min = &arr[i];
            q = &i;
        } 
    }
}

min = &arr[i];行使用了一个未初始化的变量i来索引数组。C语言中的局部变量不会神奇地初始化为零!将min初始化为NULL并立即将其设置为其他值是没有意义的。您可以使用:

int *min = &arr[0];

从理论上讲,您应该在执行此操作之前检查arr_size是否大于零。
赋值q = &i;意味着你不能再将任何信息传递回调用代码--你已经丢失了指向调用函数中变量的指针。
您可能应该使用更像这样的代码(其中您需要包含<limits.h>以获得INT_MAX):

void fMin(int arr[], int arr_size, int *pmin)
{
    if (arr_size <= 0)
    {
        *pmin = INT_MAX;
        return;
    }
    int min = arr[0];
    for (int i = 1; i < arr_size; i++)
    {
        if (arr[i] < min)
            min = arr[i];
    }
    *pmin = min;
}

这将返回最小值。如果您希望第一个元素的索引包含最小值,请稍微更改代码:

void fMin(int arr[], int arr_size, int *pmin)
{
    if (arr_size <= 0)
    {
        *pmin = INT_MAX;
        return;
    }
    int min = arr[0];
    int idx = 0;
    for (int i = 1; i < arr_size; i++)
    {
        if (arr[i] < min)
        {
            min = arr[i];
            idx = i;
        }
    }
    *pmin = idx;
}

如果希望最后一个条目的索引包含最小值,则将测试更改为if (arr[i] <= min),另一个合理的更改是让函数返回最小值或最小值的索引,而不是使用指针来保存返回值。
fMax()也有类似的问题。
fSum()中的代码可能如下所示:

int fSum(int arr[], int arr_size)
{
    int sum = 0;
    for (int i = 0; i < arr_size; i++)
        sum += arr[i];
    return sum;
}

这里我修改了返回结果的代码。注意,这很容易发生算术溢出,从而导致未定义的行为。然而,你可能不会遇到这样的问题。

相关问题