Как сделать безлимитный массив?
В C не бывает безлимитных массивов. Ничего безлимитного вообще нигде не бывает, а в C массив это именно статический массив фиксированного размера, вы создаете массив из одного char'а.  Обычно делается динамический буфер который растет от некоторого начального размера и кратно увеличивается по мере необходимости (обычно в 1.5 или 2 раза), можно растить буфер через realloc, как-то примерно так#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 64

char * getl() {
    char *buf;
    size_t bufsize = BUFSIZE;
    size_t inbuf = 0;

    buf = malloc(bufsize);
    if(!buf) return NULL; /* ошибка */
    do {
        if(inbuf >= bufsize - 1){ /* если в буфере кончается место */
            bufsize = bufsize + (bufsize>>1); /* умножение на 1.5 */
            if(!(buf = realloc(buf, bufsize))) return NULL; /* пытаемся увеличить буфер до нового размера, проверяем получилось ли */
        }
        if(!fgets(buf+inbuf, bufsize-inbuf, stdin)) break;
        inbuf +=  strlen(buf+inbuf);
    } while(buf[inbuf - 1] != '\n');
    return buf;
}

int main(){
    char * l;

    l = getl();
    if(l){
        printf("line: %s\nstrlen: %zd\n", l, strlen(l));
        free(l);
    }
    
    return 0;

}
Так "безлимитный" или "сколько хочет"? "Безлимитный" подразумевает "растущий по мере добавления элементов". Теоретически можно реализовать с постоянным realloc-ом, только зачем? "Сколько хочет" полразумевает, что юзер задал некое количество элементов массива, а потом получили память под его хранение и адресовали начало. 
Массив в С - одно-, двух-, N- мерный - это всего лишь область памяти, указатели в которой передвигаются вручную по нужным принципам. Это не перл.