calloc / malloc и читать странное поведение? - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь сохранить динамически распределенный массив строк, которые считываются с помощью системного вызова read в c.Вот небольшой пример того, что я пытаюсь сделать:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void processInput() {
    char ** array = (char **) calloc(20, sizeof(char*));
    int arrayIndex = 0;
    while(1) {
        printf("Type something: ");
        fflush(stdout);

        char* buffer;
        int readResult = read(0, buffer, 100);

        array[arrayIndex] = (char*)calloc(readResult, sizeof(char));
    }
}    

Однако это вызывает некоторые странные проблемы:


    Type something: a
    Type something: Type something: a
    Type something: Type something: abcdefg
    Type something: Type something: Type something: Type something: Type something: Type something: Type something: Type something: 

Есть ли какое-либо объяснение этому?Я не могу понять, почему это происходит.

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Заменить:

char *buffer;

с:

char buffer[100];

Измерение согласуется с аргументом read(), но ваша строка не будет заканчиваться нулем на read(), поэтому вы можете вместо этого выделить 101 байт и принудительно завершить его нулем. Вам нужно подумать об этом дополнительном байте при распределении пространства.

Обратите внимание, что выделенное пространство не используется.

Вы должны всегда проверять распределение памяти перед использованием.

Поскольку перед циклом вы выделяете только 20 указателей, цикл while (1) опасен и может позволить вам растоптать намного больше выделенного пространства, если пользователь вводит более 20 строк данных.

(Обратите внимание, что если пользователь перенаправит ввод из файла, вы не будете читать 20 строк; вы будете читать 2000 символов в 20 блоках по 100 символов, новые строки и все, а затем попадать на территорию сбоя.)

0 голосов
/ 09 января 2012

Если посмотреть на ваш вывод, он выглядит так, как будто он проходит через цикл для каждого символа на входе.

...