EOF — это маркер «файл закончился, данных больше нет». Обычно getchar даёт цифры от 0 до 255, а EOF — значение вне этих пределов (вообще-то −1).
Консоль никогда не кончается, но конец файла можно сделать, нажав Ctrl+Z.
Правильно писать
int c; int r[]; int s[];
или
int c, r[], s[];
. Но в любом случае перед нами статический массив и ему надо дать размер.
Иногда бывают массивы без размера — когда мы не заводим память, а просто говорим: «перед нами какой-то отрезок памяти». Например.
void doSmth(int a[]) {} // передаём в функцию отрезок памяти неизвестной длины
int x[5];
doSmth(x);
extern int b[]; // компилятор рассматривает b как отрезок памяти неизвестной длины.
int b[5]; // …и только линкер подставит на место b настоящий массив
В Java массивы не статические и им размер дают тогда, когда выделяют им память.
int[] x = new int[5]; // повторяю, это не Си++, а Java!
Но это уже офтоп.