从以 'NULL' 作为参数的函数返回值

Returning value from a function with 'NULL' as parameter

我有一个作业,其中函数 return 数组中元素的最小值和最大值。但是我还必须使用 'NULL' 参数从函数中获取 return 值,但我不明白。

我的代码:

int array_min(const int [], const int);
int array_max(const int [], const int);

int main() {

    int input_arr[] = {2,3,4,5,6};
    printf("%d\t", array_min(input_arr, 5));
    // : 2
    printf("%d\t", array_max(input_arr, 5));
    // : 6
    printf("%d\t", array_max(NULL, 5));
    // : -1

    return 0;
}

int array_min(const int input_arr[], const int arr_size) { 
    int a, b = arr_size, min = input_arr[0];
    for(a = 0; a < b; a++) {
        if(input_arr[a] < min) {
            min = input_arr[a];
        }
    }
    return min;
}

int array_max(const int input_arr[], const int arr_size) { 
    int a, b = arr_size, max = input_arr[0];
    for(a = 0; a < b; a++) {
        if(input_arr[a] > max) {
            max = input_arr[a];
        }
    }
    return max;
}

所以,我的问题是,如何在函数中使用 'NULL' 来获得 return 值 -1?

how do I use 'NULL' in function to get return value -1?

参数输入验证是一项常见的任务。预先进行简单测试。

输入麻烦时:

int array_min(const int input_arr[], const int arr_size) { 
  if (input_arr == NULL || arr_size <= 0) {
    return -1;
  }
  ...

Return错误时使用 -1 是一个薄弱的设计选择,因为它无法与良好的 return of -1:

区分开来
int input_arr[] = {-1, 2, 3, 4, 5};
printf("%d\t", array_min(input_arr, 5));

functions return MIN and MAX value of elements in an array.

改为考虑:return minimum/maximum 的地址。 Return NULL 出错。

// int array_min(const int input_arr[], const int arr_size) { 
const int *array_min(const int input_arr[], const int arr_size) { 
  if (input_arr == NULL || arr_size <= 0) {
    return NULL;
  }
  //int a, b = arr_size, min = input_arr[0];
  int a, b = arr_size;
  const char *min = &input_arr[0];
    // for(a = 0; a < b; a++) {
    for(a = 1; a < b; a++) {  // No need to test input_arr[0]
        //if(input_arr[a] < min) {
        if(input_arr[a] < *min) {
            //min = input_arr[a];
            min = &input_arr[a];
        }
    }
    return min;
}

现在调用代码可以检测问题了。

// printf("%d\t", array_min(input_arr, 5));
const int *min = array_min(input_arr, 5);
// or 
const int *min = array_min(input_arr, 0);
// or 
const int *min = array_min(NULL, 5);
if (min) {
  printf("%d\t", *min);
} else {
  printf("Min not found\t");
}

它是 @chux-ReinstateMonica 答案的修改版本,有一些变化。

  1. 尺寸使用 size_t(而非 int)。
  2. 如果可能,请尝试从函数中获得一个 return 点
  3. 无需检查索引 0,因为它将等于 min
  4. 在这种情况下,最好保留值和最小值的索引而不是指向它的指针(这将有助于编译器优化代码)
const int *array_min1(const size_t arr_size, const int input_arr[arr_size]) { 
    const int *result = arr_size ? input_arr : NULL;
    if (result) 
    {
        size_t a, min_index = 0;
        int min = input_arr[0];
        for(a = 1; a < arr_size; a++) {
            if(input_arr[a] < min) {
                min = input_arr[a];
                min_index = a;
            }
        }
        result = input_arr + min_index;
    }
    return result;
}