I have some code that was meant to time sort algorithms (for school) but it keeps crashing whenever array size is bigger than just 20k.
This is the main file I have:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "sorting.h"
#define ARG_COUNT 1
int main(int argc, char *argv[]) {
if (argc != ARG_COUNT + 1) {
printf("Too few or too many arguments passed.\n");
exit(1);
}
if (atoi(argv[1]) < 10000) {
printf("Array lenght should be at least 10 000.");
exit(2);
}
int arr_lenght = atoi(argv[1]);
srand(time(0));
int *arr1 = (int *)calloc(arr_lenght, arr_lenght * sizeof(int));
for (int i = 0; i < arr_lenght; i++) {
arr1[i] = rand() % 20;
}
int *arr2 = (int *)calloc(arr_lenght, arr_lenght * sizeof(int));
for (int i = 0; i < arr_lenght; i++) {
arr2[i] = rand() % 20;
}
//INSERTION SORT TIMER
int ticks_start = clock();
insertion_sort(arr1, arr_lenght);
int ticks_finish = clock();
float net_ticks = ticks_finish - ticks_start;
printf("insertion sort time:");
printf("%fl\n", (double)net_ticks / CLOCKS_PER_SEC);
//MERGE SORT TIMER
ticks_start = clock();
merge_sort(arr2, 0, arr_lenght - 1);
ticks_finish = clock();
net_ticks = ticks_finish - ticks_start;
printf("merge sort time:");
printf("%fl\n", (double)net_ticks / CLOCKS_PER_SEC);
//free
free(arr1);
free(arr2);
return 0;
}
The main function is meant to accept the array size as a command line argument and fill 2 arrays of that size with pseudo random values, then sort one with merge sort and one with insertion sort and compare the times.
You are allocating an excess of memory.
calloc(length, length * sizeof (int))allocateslength * length * sizeof (int)bytes. You are likely confusing this with the typicalmallocpattern ofmalloc(length * sizeof (int)).Assuming a 4-byte
intand a length of 20000, each allocation takes 1.6GB of memory.In the event that
callocfails to allocate memory, it will returnNULL. Some implementations (e.g., POSIX) will seterrnotoENOMEMwhen this happens.You should always test the return value of library functions that can fail.