Откуда появляется ошибка?
mid = high + low;
guess = arr[mid];
Первая очевидная ошибка здесь: сумму надо бы разделить пополам.

else if (guess < item)
  low = mid - 1;
Вторая очевидная ошибка здесь: mid может быть равен 0, а значит low может вылезти за пределы массива снизу.

С условием выхода из цикла поиска при отсутствии искомого значения в массиве тоже не всё ОК.

int arr[length];
Если length = 2147483647, то программа вообще отказывается работать.
Ты пытаешься разместить массив размером 8ГБ на стеке. Как видишь, это не очень хорошая идея.
int arr[length];

int		main(int argc, char **argv)
{
    ...
}
Объявите массив как глобальную переменную чтобы эта память была не на стеке. Или используйте malloc (+ free) для динамического выделения её в куче.