crecursion

Why do I report a segmentation fault when I use recursive C language code


#include <stdio.h>

int process(int arr[], int L, int R);
int max(int lm, int rm);

int main() {
    int arr1[] = { 14, 5, 6, 3, 8, 5, 6, 4 };
    int max = process(arr1, 0, (sizeof(arr1) / sizeof(arr1[0])) - 1);
    printf("%d", max);
}

int max(int lm, int rm) {
    return lm > rm ? lm : rm;
}

int process(int arr[], int L, int R) {
    if (L == R) {
        return arr[L];
    }
    int mid = L + (R - L) >> 1;
    if (mid > 0) {
        int leftMax = process(arr, L, mid);
        int rightMax = process(arr, mid + 1, R);
        return max(leftMax, rightMax);
    } else {
        return 0;
    }
}

I am a green hand, recently, I begin to learn algorithms. This is a procedure to find the maximum value of an array by divide and conquer. It is transplanted from java, I made some adjustments. But when I run it, a segmentation fault happens.


Solution

  • There are multiple problems:

    Here is a modified version:

    #include <stdio.h>
    
    int process(const int arr[], int L, int R);
    int max(int lm, int rm);
    
    int main(void) {
        int arr1[] = { 14, 5, 6, 3, 8, 5, 6, 4 };
        int max = process(arr1, 0, (sizeof(arr1) / sizeof(arr1[0])) - 1);
        printf("%d\n", max);
        return 0;
    }
    
    int max(int lm, int rm) {
        return lm > rm ? lm : rm;
    }
    
    int process(const int arr[], int L, int R) {
        if (L == R) {
            return arr[L];
        }
        int mid = L + ((R - L) >> 1);
        int leftMax = process(arr, L, mid);
        int rightMax = process(arr, mid + 1, R);
        return max(leftMax, rightMax);
    }