我一直在尝试运行这段代码,并不断得到分段错误,但数组打印。我到底做错了什么?我相信问题主要是在某处与格式的函数或与参数,我把函数,我已经尝试了这么多的方式,但没有我尝试过似乎工作。
#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
1条答案
按热度按时间qyyhg6bp1#
你的大部分问题都在于以下几行:
将未初始化的指针
p
和q
传递给fMax()
和fMin()
;这是一个崩溃的秘诀,在计算和之前先计算平均值(因此sum
未初始化)。您需要的代码更像:
我没有检查函数,但调用肯定是假的。
函数中也有问题,例如,在
fMin()
中,并不完全清楚是传递回最小值的索引还是实际的最小值,但问题很多。您已经:
min = &arr[i];
行使用了一个未初始化的变量i
来索引数组。C语言中的局部变量不会神奇地初始化为零!将min
初始化为NULL
并立即将其设置为其他值是没有意义的。您可以使用:从理论上讲,您应该在执行此操作之前检查
arr_size
是否大于零。赋值
q = &i;
意味着你不能再将任何信息传递回调用代码--你已经丢失了指向调用函数中变量的指针。您可能应该使用更像这样的代码(其中您需要包含
<limits.h>
以获得INT_MAX
):这将返回最小值。如果您希望第一个元素的索引包含最小值,请稍微更改代码:
如果希望最后一个条目的索引包含最小值,则将测试更改为
if (arr[i] <= min)
,另一个合理的更改是让函数返回最小值或最小值的索引,而不是使用指针来保存返回值。fMax()
也有类似的问题。fSum()
中的代码可能如下所示:这里我修改了返回结果的代码。注意,这很容易发生算术溢出,从而导致未定义的行为。然而,你可能不会遇到这样的问题。