Search code examples
ccrashbigdatadynamic-memory-allocationmergesort

Program crashes when given a big number


I'm trying to make a merge sort algorithm in C. The problem is that it does not work for a big number of elements. If the array has 100000 elements it's OK but if it has 1e6 or 1e7 then it crashes. I thought that you cannot give such a big number of elements for an array but after I have read that this is not true, you should be able to give 1e7 elements. After that I thought that maybe int range is to small but that's not the case, int goes to 1e9. I don't really know what's the problem and why it doesn't work, so please help. Thanks in advance!

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

int n;
void merge(int *, int, int);
void mergeSort(int *, int, int);
void bubbleSort(int *, int);

int main() {
//    scanf("%d",&n);
    n = 10000000;
    int *a = (int *)malloc(n * sizeof(int));
    if (a == NULL) {
        printf("Nu s-a putut aloca memorie.");
        exit(0);
    }
    for (int i = 0; i < n; i++)
        a[i] = rand() % 50;

    mergeSort(a, 0, n - 1);
    //bubbleSort(a, n - 1);

//  for (int i = 0; i < n; i++) {
//      printf("%d ", a[i]);
//  }
    free(a);
    return 0;
}

void merge(int *a, int start, int sfarsit) {
    int mij = (start + sfarsit) / 2;
    int i = start;
    int j = mij + 1;
    int k = start;
    int aux[10000000];

    while (i <= mij && j <= sfarsit) {
        if (a[i] < a[j])
            aux[k++] = a[i++];
        else
            aux[k++] = a[j++];
    }
    while (i <= mij)
        aux[k++] = a[i++];
    while (j <= sfarsit)
        aux[k++] = a[j++];
    for (int i = start; i <= sfarsit; i++)
        a[i] = aux[i];
}

void mergeSort(int *a, int start, int sfarsit) {
    if (start >= sfarsit)
        return ;

    int mij = (start + sfarsit) / 2;

    mergeSort(a, start, mij);
    mergeSort(a, mij + 1, sfarsit);
    merge(a, start, sfarsit);
}

Solution

  • This:

    int aux[10000000];
    

    is problem. That will be to much for the stack to handle. Change to this:

    int *aux = malloc(sizeof(*aux) * 10000000);
    

    Of course, you need to use free(aux) in the end of the function merge and also check if the allocation was successful.

    Also, you should of course allocate in relation to sfarsit but judging from your other code, it does not seem like I need to tell you that.