Копирование массива

Я пытаюсь прочитать символы из консоли, при этом я не знаю сколько символов я получу. Поэтому я объявляю динамический массив символов и читаю ввод посимвольно. Когда кол-во введенных символов достигает границы массива, я создаю новый массив, копирую в него символы из основного массива, снова объявляю массив с размером вдвое больше и копирую все в него.

void init(void){
// получаем строку цифр разделенных пробелами
    char part;
    int pos = 0;
    int len = 2;
    char* array = (char*)malloc(len * sizeof(char));
    while (1){
        part = (char)getchar();
        if (part == '\n') {
            break;
        }
        array[pos] = part;
        pos++;
        if (pos == len) {
            char* buf = (char*)malloc(len * sizeof(char));
            for (int i = 0; i < len; ++i){
                buf[i] = array[i];
            }

            int old_len = len;
            len = len * 2;
            free(array);
            char* array = (char*)malloc(len * sizeof(char));
            for (int i = 0; i < old_len; ++i){
                array[i] = buf[i];
            }
            free(buf);
        }
    }
    printf("%lu", sizeof(array));
    printf("%s", array);
    free(array);
// генерируем на основе этой строки массив
// вычисляем сумму четных элементов
// выводим результат

}

Вопросов несколько. Почему printf("%lu", sizeof(array)); всегда выводит 8? И почему когда кол-во символов достигает 16, то новое копирование не срабатывает, т.е. в buf уже ничего не копируется? При этом если я укажу len равным 32, а введенное кол-во символов будет соразмерно, то все хорошо, а если будет хоть на символ больше, то я получу мусор.


Ответы (1 шт):

Автор решения: Harry

Почему printf("%lu", sizeof(array)); всегда выводит 8?

Потому что array у вас - указатель на char, а в 64-разрядном приложении размер указателя - 8 байт.

С остальным... Держите код и сами разберитесь, в чем он отличается от вашего.

void init(void)
{
    char part;
    int pos = 0;
    int len = 2;
    char* array = (char*)malloc(len * sizeof(char));
    while (1){
        part = (char)getchar();
        if (part == '\n') {
            break;
        }
        array[pos++] = part;
        if (pos == len-1)
        {
            char* buf = (char*)malloc(2*len*sizeof(char));
            for (int i = 0; i < pos; ++i)
                buf[i] = array[i];
            len *= 2;
            free(array);
            array = buf;
        }
    }
    array[pos] = 0;
    printf("%s", array);
    free(array);
}

И еще - если уж С, то вот эти приведения - (char*)malloc... - не нужны. Видимо, вы просто дали файлу расширение .cpp, вот он и компилируется как С++.

→ Ссылка