Вы не можете вернуть массив как таковой из функции в C (или C ++).
То, что в настоящее время делает ваш код: он неявно распадает массив int [] на указатель int *, а затем неявно преобразует int * в long, а затем возвращает long. Это не указатель или массив, и, следовательно, оператор индекса не может быть применен к нему.
Вы могли бы вернуть int *, но возвращать указатель на локальный массив arr
было бы неправильно (ваш компилятор не смог бы отловить ошибку, но вы вызовете неопределенное поведение во время выполнения ) потому что, как только функция завершается, arr
официально не существует и, следовательно, возвращаемый указатель свисает.
Вы можете:
выделить массив с помощью malloc () и вернуть указатель (но затем вы должны выяснить, кто собирается освободить () выделение, и убедиться, что это произойдет ровно один раз); или
передать указатель на массив и заполнить массив этим указателем (теперь вызывающий объект отвечает за создание и управление массивом) - это, вероятно, обычный подход в C; или
создать структуру, которая оборачивает массив, и вернуть один из них (или, в этом отношении, передать указатель на один).
Также обратите внимание, что int arr[ceiling + 1];
является конструкцией C99; это не допускается ни в стандартном «традиционном» C (C89 и т. д.), ни в стандартах C ++. В этих языках размер массивов должен быть известен во время компиляции.
В C ++ вы также можете передавать массив по ссылке или использовать boost::array
(который является «структурой, которая оборачивает массив», но также использует перегрузку операторов, чтобы сделать его более прозрачным, как массив).