@Gagatyn
Самоучка

Как сделать безлимитный массив?

Здравствуйте. Не могу никак добиться безлимитного массива. Чтобы пользователь мог вводить сколько хочет. Подскажите как сделать правильно.
#include <stdio.h>
#include <stdlib.h>

int main() {
    char a[] = "";
    size_t size_a;
    int *b;
    scanf("%s", a);
    size_a = sizeof(a) / sizeof(char);
    b = (int *) calloc(size_a, sizeof(int));
    if (!b) {
        printf("fail!!!");
    }
    printf("%s\nsize a = %d\n", a, size_a);
    free(b);
    return 0;
}
  • Вопрос задан
  • 264 просмотра
Решения вопроса 1
В 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;

}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Так "безлимитный" или "сколько хочет"? "Безлимитный" подразумевает "растущий по мере добавления элементов". Теоретически можно реализовать с постоянным realloc-ом, только зачем? "Сколько хочет" полразумевает, что юзер задал некое количество элементов массива, а потом получили память под его хранение и адресовали начало.

Массив в С - одно-, двух-, N- мерный - это всего лишь область памяти, указатели в которой передвигаются вручную по нужным принципам. Это не перл.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы