Эта функция
void push(long *arr,long value, int *size){
//printf("%ld",value);
arr = realloc(arr,8 + (8 * (*size + 1))); //allocate 4 more bytes to the arr
arr[*size] = value; //add the value to the end of array
*size = *size + 1; //increase size of array
}
не изменяет исходный указатель обр. Он имеет дело с копией указателя. Таким образом, вызов reallo c в функции каждый раз пытается освободить один и тот же объем уже освобожденной памяти.
Вы должны передать указатель по ссылке
void push(long **arr,long value, int *size){
//printf("%ld",value);
*arr = realloc(*arr,8 + (8 * (*size + 1))); //allocate 4 more bytes to the arr
( *arr )[*size] = value; //add the value to the end of array
*size = *size + 1; //increase size of array
}
и вызвать его вроде
push( &arr,atol(str),&size);
Обратите внимание на то, что такой вызов функции reallo c
*arr = realloc(*arr,8 + (8 * (*size + 1))); //allocate 4 more bytes to
небезопасен. Функция может возвращать NULL. В этом случае адрес ранее выделенной памяти будет потерян.
Вам следует использовать некоторую промежуточную переменную. Если распределение прошло успешно, присвойте указателю *arr
значение промежуточного значения.