来自函数的 C 分段错误 returns 数组的最大值

C Segmentation Fault from function that returns the maximum of an array

我只有一个函数可以找出整数数组的最大值,但我得到了一个分段错误,我找不到,因为编译器没有'不要告诉我错误所在的行。

这是我的 C 代码:

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

//Funktion ermittelt den größten Wert eines Arrays
int groesstesElement(int **arrayPointer){
    int max = 0;
    for (int i = 0; i < 3; i++) {
        if (*arrayPointer[i]>max) {
            max = *arrayPointer[i];
        }
    }
    return max;
}


int main (int argc, char **argv) {
    int array[4]={1,2,3,4};
    int *ptr = array;
    int z = groesstesElement(&ptr);
    printf("%d\n", z);

    return EXIT_SUCCESS;
}

我使用 macOS 和 VSC。

在 C 中,数组索引 [] 比指针解除引用 * 具有更高的优先级:https://en.cppreference.com/w/c/language/operator_precedence

一些括号修复了段错误。

if ((*arrayPointer)[i]>max) {
    max = (*arrayPointer)[i];
}

由于运算符的优先级,

*arrayPointer[i]

你在告诉你的程序:

Take the i-th element of the array arrayPointer and dereference it.

但是arrayPointer是指向int *的指针,所以你得到的只是ptr(从main定义的int **指针)的地址和一个偏移量。当您最终取消引用它时,您可能会访问无效地址,从而导致分段错误。

正如主要答案所建议的那样,修复是使用括号完成的,以便按照您想要的顺序应用运算符:

(*arrayPointer)[i]

代码中的次要问题

即使通过上述更正程序不会再崩溃,它将无法运行。用循环搜索数组

for (i = 0; i < 3; i++) 

您不会在搜索中包含最后一项(索引 3),恰好跳过在您的示例中包含最大值的索引。您可能是指 for (i = 0; i < 4; i++)for (i = 0; i <= 3; i++).

无论如何,在代码中使用幻数(在本例中是数组的维度)被认为是不好的做法。更好的解决方案是使用 #define,但更好的解决方案是将数组的大小传递给函数:

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

#define ARR_SIZE 4

//Funktion ermittelt den größten Wert eines Arrays
int groesstesElement(int *arrayPointer, unsigned int arrSize){
    int max = 0, i;
    for (i = 0; i < arrSize; i++) {
        if (arrayPointer[i]>max) {
            max = arrayPointer[i];
        }
    }
    return max;
}


int main (int argc, char **argv) {
    int array[ARR_SIZE]={1,2,3,4};
    int z = groesstesElement(array, ARR_SIZE);
    printf("%d\n", z);

    return EXIT_SUCCESS;
}

请注意如何不再需要使用双指针