在C中查找数组中的最大元素

时间:2017-03-08 06:56:36

标签: c arrays pointers segmentation-fault

我的程序需要有一个函数,在其中找到数组的最大元素。然后它返回最大元素的位置。但是,当找到最大的元素时,我只允许使用指针算法。

#include <stdio.h>

int *largest(int *array, int size){
    int *p1 = array;
    int *count, max = *p1;
    for(*count = 0; count < p1 + size - 1; p1++){
        if (max < *p1){
            max = *p1;
            count++;
        }
    }
    return count;
}

int main(void){
    int *array, size = 10;

    printf("enter elements; ");
    for(int i = 0; i < size; i++){
        scanf("%d ", &array);
        array++;
    }

    printf("\nThe largest element in the array is in element %d", *largest(array, size));
}

但是,当我运行程序时,输入元素的值后,它会给我:

segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:1)

函数main中的错误:

您没有为阵列分配内存。您需要添加第array = (int*) malloc(sizeof(int) * size);行。 如果没有此行,您将获得segmentation fault

另一个错误是填充阵列。数组已经是指针,因此您不必再次引用它。 现在您要更改指针,而不是数组值

潜在错误:在填充数组的循环中,增加指针,因此您将丢失有关数组开头的信息。你可以在循环执行array = array - size;之后再次获取它,但如果你先断开循环它就不会工作。最好使用临时指针。

函数中的错误最大:

您创建了指针count,该指针未分配,然后在for循环初始化中将值0写入未知地址。 导致segmentation fault

在for循环中,您尝试从地址 0 读取内存以寻址数组+大小 - 2 ,但是您想要从数组的开头到结尾读取它数组的数组,从数组数组+大小 - 1

返回count毫无意义,但总结一下,请看一下示例。

指针只是数字,它是内存的地址,所以当你不分配它或者不分配现有的指针时,它会随机指向内存,操作系统不允许你访问它记忆。你可能会从随机指针中读取一些内容,但是新的编译器会将初始值设置为0.在BSD中,你可以从地址0读取,但linux导致分段错误(我希望我没有切换它)。写入地址0会导致两个系统中的分段错误。

如果你有有效的指针,你也应该检查函数,并且分配可能会失败,所以你需要在分配后立即检查指针。总结一下:永远不要相信指针,总是检查它的有效性。

示例不会检查指针的有效性。

#include <stdio.h>

int *largest(int *array, int size){
    int *end = array + size; // address behind array
    int *max = *array; // address with largest value
    for(; array < end; ++array){ // you dont need initialization since the array points to beginning
        if (*max < *array){ // compare values, not address
            max = array; // save position of pointer with largest value
        }
    }
    return max; // return address with largest value
}

int main(void){
    int *array, size = 10;
    array = (int*)malloc(sizeof(int) * size); // allocate memory

    printf("enter elements; ");

    int *tmp = array; // temporary variable to not loose information about beginning of array
    for(int i = 0; i < size; i++){
        scanf("%d ", tmp); // reference is not needed since tmp is already pointer to value
        tmp++;
    }

    printf("\nThe largest element in the array is in element %d", *largest(array, size));
}